UCLUST con id = 97, 98 y 99%

Estas graficas representan las secuencias del Gen E del virus del Dengue analizadas con UCLUST con id= 97, 98 y 99%.

De un total de 5591 datos con genoma completo:

Secuencias similares al 97%

Tabla 1. Datos de secuencias del Gen E 97% disimilares.

Secuencias disimilares al 98%

Tabla 2. Datos de secuencias del Gen E 98% disimilares.

Tabla 3. Datos de secuencias del GEn E 99% disimilares.

Serotipos

Figura 1. Numero de datos por serotipos para las secuencias Disimilares al 97, 98 y 99%

Paises

Figura 2. Paises para secuencias de Gen E 97% disimilares.

India China Tailandia Indonesia Singapur VietNam Filipinas PuertoRico Pakistan Malasia Myanmar Brazil Australia Venezuela EstadosUnidos Timor Somalia Peru Paraguay Mexico PolinesaFrancesa Cambodia Yemen TrinidadYTobago Taiwan SriLanka SurCorea ArabiaSaudita Samoa SanVicenteYGranadas Rusia Nigeria Nicaragua NuevaCaledonia Japon Guam Francia Ecuador Cotedvoire Barbados Bangladesh Argentina

Figura 3. Paises para secuencias de Gen E 98% disimilares.

India China Tailandia Indonesia Singapur VietNam Filipinas PuertoRico Pakistan Malasia Myanmar Brazil Australia Venezuela EstadosUnidos Timor Somalia Peru Paraguay Mexico PolinesaFrancesa Cambodia Yemen TrinidadYTobago Taiwan SriLanka SurCorea ArabiaSaudita Samoa SanVicenteYGranadas Rusia Nigeria Nicaragua NuevaCaledonia Japon Guam Francia Ecuador Cotedvoire Barbados Bangladesh Argentina Peru Honduras Colombia PapuaNuevaGuinea ElSalvador IslaVirgen SurEsteAsia SantaLucia Martinique Laos Haiti Granada Ghana Fiji Angola

Figura 4. Paises para secuencias de Gen E 99% disimilares.

Mapa-Mundi: Numero de casos reportados por paises

Figura 5. Numero de casos reportados por paises.

Mapa-mundi: Serotipos por paises

Figura 6. Distribucion de los serotipos por paises para secuencias 97% disimilares.

Figura 7. Distribucion de los serotipos por paises para secuencias 98% disimilares.

Figura 8. Distribucion de los serotipos por paises para secuencias 99% disimilares.

Localidades: Disimilaridad 97%

Figura 9. Nube de localidades para secuecias del Gen E 97% Disimilares.

Localidades: Disimilaridad 98%

Figura 10. Nube de localidades para secuecias del Gen E 98% Disimilares.

Localidades: Disimilaridad 99%

Figura 11. Nube de localidades para secuecias del Gen E 99% Disimilares.

Mapa-mundi localidades 97% Disimilaridad

Figura 12. Localidades de secuencias del Gen E 97% disimilares.

Mapa-mundi localidades 98% Disimilaridad

Figura 13. Localidades de secuencias del Gen E 98% disimilares.

Mapa-mundi localidades 99% Disimilaridad

Figura 14. Localidades de secuencias del Gen E 99% disimilares.

Años: Disimilaridad 97%

Figura 15. Años registrados para casos con secuencias 97% disimilares.

1945 1960 1962 1963 1968 1970 1972 1973 1974 1978 1979 1980 1982 1983 1986 1988 1991 1993 1994 1995 1996 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 20012 2013 2014

Años: Disimilaridad 98%

Figura 16. Años registrados para casos con secuencias 98% disimilares.

1945 1960 1961 1962 1963 1965 1966 1968 1970 1972 1973 1974 1977 1978 1979 1980 1981 1982 1983 1985 1986 1987 1988 1989 1991 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014

Años: Disimilaridad 99%

Figura 17. Años registrados para casos con secuencias 99% disimilares.

Frecuencia de los años reportados por cada pais: Disimilaridad 97%

Figura 18. Frecuencia de los años reportados para cada pais para secuencias 97% disimilaridad.

Frecuencia de los años reportados por cada pais: Disimilaridad 98%

Figura 19. Frecuencia de los años reportados para cada pais para secuencias 98% disimilaridad.

Frecuencia de los años reportados por cada pais: Disimilaridad 99%

Figura 20. Frecuencia de los años reportados para cada pais para secuencias 99% disimilaridad.

Pais, localidad y año

Figura 21. Frecuencia de los datos con disimilaridad del 97, 98 y 99% que contienen: 1. Pais, 2. Pais y Localidad, 3. Pais, Localidad y año, 4. Pais y año.

LS0tCnRpdGxlOiAiUmVzdWx0YWRvcyBVQ0xVU1QgcGFyYSBzZWN1ZW5jaWFzIGRlbCBHZW4gRSBjb24gaWQ9IDk3LCA5OCB5IDk5JSIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQojIyMgVUNMVVNUIGNvbiBpZCA9IDk3LCA5OCB5IDk5JSAjIyMKCkVzdGFzIGdyYWZpY2FzIHJlcHJlc2VudGFuIGxhcyBzZWN1ZW5jaWFzIGRlbCBHZW4gRSBkZWwgdmlydXMgZGVsIERlbmd1ZSBhbmFsaXphZGFzIGNvbiBVQ0xVU1QgY29uIGlkPSA5NywgOTggeSA5OSUuCgpEZSB1biB0b3RhbCBkZSA1NTkxIGRhdG9zIGNvbiBnZW5vbWEgY29tcGxldG86CgoqIGlkIDk3JSA6IDE0MiBTZWN1ZW5jaWFzIGRpc2ltaWxhcmVzCiogaWQgOTglIDogMzA1IFNlY3VlbmNpYXMgZGlzaW1pbGFyZXMKKiBpZCA5OSUgOiAxMzEwIFNlY3VlbmNpYXMgZGlzaWxhcmVzCgoKIyMjIFNlY3VlbmNpYXMgc2ltaWxhcmVzIGFsIDk3JSAjIyMKYGBge3IsIGZpZy53aWR0aCA9IDEwLCBmaWcuaGVpZ2h0ID0gNixlY2hvID0gRkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgppZHNfOTggPC0gcmVhZC5jc3YoZmlsZSA9ICIvaG9tZS9hbmRyZWEvTFNCL1BpbG90b19EZW5ndWUvZGF0YS9TZWN1ZW5jaWFzX2Rlc2NhcmdhZGFzL1NlY3VlbmNpYXNfZ2VuRS9HZW5FXzk4X0Rpc2ltaWxhcmlkYWRfaWQuY3N2IiwgaGVhZGVyID0gRikKCmlkc185NyA8LSByZWFkLmNzdihmaWxlID0gIi9ob21lL2FuZHJlYS9MU0IvUGlsb3RvX0Rlbmd1ZS9kYXRhL1NlY3VlbmNpYXNfZGVzY2FyZ2FkYXMvU2VjdWVuY2lhc19nZW5FL0dlbkVfOTdfRGlzaW1pbGFyaWRhZF9pZC5jc3YiLCBoZWFkZXIgPSBGKQoKaWRzXzk5IDwtIHJlYWQuY3N2KGZpbGUgPSAiL2hvbWUvYW5kcmVhL0xTQi9QaWxvdG9fRGVuZ3VlL2RhdGEvU2VjdWVuY2lhc19kZXNjYXJnYWRhcy9TZWN1ZW5jaWFzX2dlbkUvR2VuRV85OV9EaXNpbWlsYXJpZGFkX2lkLmNzdiIsIGhlYWRlciA9IEYpCgpHZW5FIDwtIHJlYWQuY3N2KGZpbGUgPSAiL2hvbWUvYW5kcmVhL0xTQi9QaWxvdG9fRGVuZ3VlL2RhdGEvQmFzZV9EYXRvcy9HZW5FLmNzdiIsIGhlYWRlciA9IFQpCgpHZW5FJE5fQWNjZXNpb24gPC0gYXMuY2hhcmFjdGVyKEdlbkUkTl9BY2Nlc2lvbikKCmlkc185OCRWMSA8LSBhcy5jaGFyYWN0ZXIoaWRzXzk4JFYxKQoKaWRzXzk3JFYxIDwtIGFzLmNoYXJhY3RlcihpZHNfOTckVjEpCgppZHNfOTkkVjEgPC0gYXMuY2hhcmFjdGVyKGlkc185OSRWMSkKCiMjIDk3JQoKcG9zaWNpb25fOTcgPC0gdmVjdG9yKCkKCmZvcihpIGluIDE6bGVuZ3RoKGlkc185NyRWMSkpewogIHBvc2ljaW9uXzk3W2ldIDwtIHdoaWNoKEdlbkUkTl9BY2Nlc2lvbj09aWRzXzk3JFYxW2ldKQp9CgpEaXNfOTcgPC0gR2VuRVtwb3NpY2lvbl85NyxdCgp3cml0ZS5jc3YoRGlzXzk3LCBmaWxlID0gIi9ob21lL2FuZHJlYS9MU0IvUGlsb3RvX0Rlbmd1ZS9kYXRhL1NlY3VlbmNpYXNfZGVzY2FyZ2FkYXMvU2VjdWVuY2lhc19nZW5FLy9EaXNpbWlsYXJlczk3LmNzdiIpICAgIAoKRGlzXzk3WywyOjIxXQoKRGlzXzk3W2MoMiw1LDksMTAsMTEpXQp3cml0ZS5jc3YoRGlzXzk3W2MoMiw1LDksMTAsMTEpXSwgZmlsZSA9ICIvaG9tZS9hbmRyZWEvTFNCL1BpbG90b19EZW5ndWUvZGF0YS90YWJsYXMvU2VjdWVuY2lhc19nZW5FLmNzdiIpCgpgYGAKKipUYWJsYSAxLioqIERhdG9zIGRlIHNlY3VlbmNpYXMgZGVsIEdlbiBFIDk3JSBkaXNpbWlsYXJlcy4KCgojIyMgU2VjdWVuY2lhcyBkaXNpbWlsYXJlcyBhbCA5OCUgIyMjCmBgYHtyLCBmaWcud2lkdGggPSAxMCwgZmlnLmhlaWdodCA9IDYsZWNobyA9IEZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKIyMgOTglCgpwb3NpY2lvbl85OCA8LSB2ZWN0b3IoKQoKZm9yKGkgaW4gMTpsZW5ndGgoaWRzXzk4JFYxKSl7CiAgcG9zaWNpb25fOThbaV0gPC0gd2hpY2goR2VuRSROX0FjY2VzaW9uPT1pZHNfOTgkVjFbaV0pCn0KCkRpc185OCA8LSBHZW5FW3Bvc2ljaW9uXzk4LF0KCndyaXRlLmNzdihEaXNfOTgsIGZpbGUgPSAiL2hvbWUvYW5kcmVhL0xTQi9QaWxvdG9fRGVuZ3VlL2RhdGEvU2VjdWVuY2lhc19kZXNjYXJnYWRhcy9TZWN1ZW5jaWFzX2dlbkUvL0Rpc2ltaWxhcmVzOTguY3N2IikgICAgCgpEaXNfOThbLDI6MjFdCgpgYGAKKipUYWJsYSAyLioqIERhdG9zIGRlIHNlY3VlbmNpYXMgZGVsIEdlbiBFIDk4JSBkaXNpbWlsYXJlcy4KCmBgYHtyLCBmaWcud2lkdGggPSAxMCwgZmlnLmhlaWdodCA9IDYsZWNobyA9IEZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKCiMjIDk5JQoKcG9zaWNpb25fOTkgPC0gdmVjdG9yKCkKCmZvcihpIGluIDE6bGVuZ3RoKGlkc185OSRWMSkpewogIHBvc2ljaW9uXzk5W2ldIDwtIHdoaWNoKEdlbkUkTl9BY2Nlc2lvbj09aWRzXzk5JFYxW2ldKQp9CgpEaXNfOTkgPC0gR2VuRVtwb3NpY2lvbl85OSxdCgp3cml0ZS5jc3YoRGlzXzk5LCBmaWxlID0gIi9ob21lL2FuZHJlYS9MU0IvUGlsb3RvX0Rlbmd1ZS9kYXRhL1NlY3VlbmNpYXNfZGVzY2FyZ2FkYXMvU2VjdWVuY2lhc19nZW5FLy9EaXNpbWlsYXJlczk5LmNzdiIpICAgIAoKRGlzXzk5WywyOjIxXQoKCmBgYAoqKlRhYmxhIDMuKiogRGF0b3MgZGUgc2VjdWVuY2lhcyBkZWwgR0VuIEUgOTklIGRpc2ltaWxhcmVzLgoKCiMjIyBTZXJvdGlwb3MgIyMjCgoKYGBge3IsIGZpZy53aWR0aCA9IDEwLCBmaWcuaGVpZ2h0ID0gNixlY2hvID0gRkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgojIDk4CgpEMV85OCA8LSBsZW5ndGgoRGlzXzk4W0Rpc185OCRTZXJvdHlwZT09IkRFTlZfMSIsNV0pCkQyXzk4IDwtIGxlbmd0aChEaXNfOThbRGlzXzk4JFNlcm90eXBlPT0iREVOVl8yIiw1XSkKRDNfOTggPC0gbGVuZ3RoKERpc185OFtEaXNfOTgkU2Vyb3R5cGU9PSJERU5WXzMiLDVdKQpENF85OCA8LSBsZW5ndGgoRGlzXzk4W0Rpc185OCRTZXJvdHlwZT09IkRFTlZfNCIsNV0pCgoKZGF0YSA8LSBjKCBEMV85OCwgRDJfOTgsIEQzXzk4LCBENF85OCkKCk5hbWVfc2Vyb3R5cGUgPC0gc29ydCh1bmlxdWUoRGlzXzk4JFNlcm90eXBlKSkKCnNlcm90eXBlXzk4IDwtIGRhdGEuZnJhbWUoZGF0YSwgTmFtZV9zZXJvdHlwZSkKCiMgOTcKCkQxX0QgPC0gbGVuZ3RoKERpc185N1tEaXNfOTckU2Vyb3R5cGU9PSJERU5WXzEiLDVdKQpEMl9EIDwtIGxlbmd0aChEaXNfOTdbRGlzXzk3JFNlcm90eXBlPT0iREVOVl8yIiw1XSkKRDNfRCA8LSBsZW5ndGgoRGlzXzk3W0Rpc185NyRTZXJvdHlwZT09IkRFTlZfMyIsNV0pCkQ0X0QgPC0gbGVuZ3RoKERpc185N1tEaXNfOTckU2Vyb3R5cGU9PSJERU5WXzQiLDVdKQoKCmRhdGEgPC0gYyggRDFfRCwgRDJfRCwgRDNfRCwgRDRfRCkKCk5hbWVfc2Vyb3R5cGUgPC0gc29ydCh1bmlxdWUoRGlzXzk3JFNlcm90eXBlKSkKCnNlcm90eXBlXzk3IDwtIGRhdGEuZnJhbWUoZGF0YSwgTmFtZV9zZXJvdHlwZSkKCiMgOTkKCkQxX0QgPC0gbGVuZ3RoKERpc185OVtEaXNfOTkkU2Vyb3R5cGU9PSJERU5WXzEiLDVdKQpEMl9EIDwtIGxlbmd0aChEaXNfOTlbRGlzXzk5JFNlcm90eXBlPT0iREVOVl8yIiw1XSkKRDNfRCA8LSBsZW5ndGgoRGlzXzk5W0Rpc185OSRTZXJvdHlwZT09IkRFTlZfMyIsNV0pCkQ0X0QgPC0gbGVuZ3RoKERpc185OVtEaXNfOTkkU2Vyb3R5cGU9PSJERU5WXzQiLDVdKQoKCmRhdGEgPC0gYyggRDFfRCwgRDJfRCwgRDNfRCwgRDRfRCkKCk5hbWVfc2Vyb3R5cGUgPC0gc29ydCh1bmlxdWUoRGlzXzk5JFNlcm90eXBlKSkKCnNlcm90eXBlXzk5IDwtIGRhdGEuZnJhbWUoZGF0YSwgTmFtZV9zZXJvdHlwZSkKCnR5cGUgPC0gYygiOTcgJSBEaXNpbWlsYXJpZGFkIiwgIjk3ICUgRGlzaW1pbGFyaWRhZCIsICI5NyAlIERpc2ltaWxhcmlkYWQiLCAiOTcgJSBEaXNpbWlsYXJpZGFkIiwgIjk4ICUgRGlzaW1pbGFyaWRhZCIsICI5OCAlIERpc2ltaWxhcmlkYWQiLCAiOTggJSBEaXNpbWlsYXJpZGFkIiwgIjk4ICUgRGlzaW1pbGFyaWRhZCIsICI5OSAlIERpc2ltaWxhcmlkYWQiLCAiOTkgJSBEaXNpbWlsYXJpZGFkIiwgIjk5ICUgRGlzaW1pbGFyaWRhZCIsICI5OSAlIERpc2ltaWxhcmlkYWQiKQoKc2Vyb3R5cGUgPC0gcmJpbmQoc2Vyb3R5cGVfOTcsc2Vyb3R5cGVfOTgsc2Vyb3R5cGVfOTkpCgpzZXJvdHlwZSA8LSBjYmluZChzZXJvdHlwZSx0eXBlKQoKbGlicmFyeSgiZ2dwbG90MiIpCgpnZ3Bsb3QoZGF0YSA9IHNlcm90eXBlLCBhZXMoeD1OYW1lX3Nlcm90eXBlICwgeSA9IGRhdGEsIGZpbGw9dHlwZSkpKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgpKSsKICBzY2FsZV9jb2xvdXJfYnJld2VyKCkrCiAgdGhlbWVfbWluaW1hbCgpCgpgYGAKKipGaWd1cmEgMS4qKiBOdW1lcm8gZGUgZGF0b3MgcG9yIHNlcm90aXBvcyBwYXJhIGxhcyBzZWN1ZW5jaWFzIERpc2ltaWxhcmVzIGFsIDk3LCA5OCB5IDk5JQoKCiMjIyBQYWlzZXMgIyMjCmBgYHtyLCBmaWcud2lkdGggPSAxMCwgZmlnLmhlaWdodCA9IDYsZWNobyA9IEZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKQ291bnRyeV9uYW1lcyA8LSB1bmlxdWUoRGlzXzk3JENvdW50cnkpCgoKY291bnRyeS45NzwtIGRhdGEuZnJhbWUoKQoKZm9yKGkgaW4gMTpsZW5ndGgoQ291bnRyeV9uYW1lcykpewogIGNvdW50cnkuOTdbaSwiQ291bnRyeV9uYW1lcyJdIDwtIENvdW50cnlfbmFtZXNbaV0KICBjb3VudHJ5Ljk3W2ksICJudW1iZXJfY2FzZXMiXSA8LSBsZW5ndGgoRGlzXzk3W3doaWNoKERpc185NyRDb3VudHJ5PT1Db3VudHJ5X25hbWVzW2ldKSw5XSkKICBjb3VudHJ5Ljk3WzIwLCAibnVtYmVyX2Nhc2VzIl0gPC0gbGVuZ3RoKHdoaWNoKGlzLm5hKERpc185NyRDb3VudHJ5KT09VCkpCn0KCmNvdW50cnkuOTcgPC0gdHJhbnNmb3JtKGNvdW50cnkuOTcsIENvdW50cnlfbmFtZXM9IHJlb3JkZXIoQ291bnRyeV9uYW1lcywgK251bWJlcl9jYXNlcykpCgpnZ3Bsb3QoZGF0YSA9IGNvdW50cnkuOTcsIGFlcyh4ID0gQ291bnRyeV9uYW1lcywgeSA9IG51bWJlcl9jYXNlcywgY29sb3I9Q291bnRyeV9uYW1lcykpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgZmlsbD0id2hpdGUiKSsKICBsYWJzKHg9ICJDb3VudHJ5IiwgeT0gIkRhdGEgTnVtYmVyIikrCiAgc2NhbGVfY29sb3JfZ3JleShzdGFydD0gMC43LCBlbmQ9MC4xKSsKICB0aGVtZV9jbGFzc2ljKCkrCiAgZ2d0aXRsZSgiRGlzaW1pbGFyZXMgOTclIikrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikrCiAgY29vcmRfZmxpcCgpCgojIFBhaXNlcyBxdWUgZnVlcm9uIGVsaW1pbmFkb3M6CiMgc2V0ZGlmZihjb3VudHJ5LnNpbWlsYXJlcyRDb3VudHJ5X25hbWVzLCBjb3VudHJ5LmRpc2ltaWxhcmVzJENvdW50cnlfbmFtZXMpCgpgYGAKKipGaWd1cmEgMi4qKiBQYWlzZXMgcGFyYSBzZWN1ZW5jaWFzIGRlIEdlbiBFIDk3JSBkaXNpbWlsYXJlcy4KCkluZGlhIENoaW5hIFRhaWxhbmRpYSBJbmRvbmVzaWEgU2luZ2FwdXIgVmlldE5hbSBGaWxpcGluYXMgUHVlcnRvUmljbyBQYWtpc3RhbiBNYWxhc2lhIE15YW5tYXIgQnJhemlsIEF1c3RyYWxpYSBWZW5lenVlbGEgRXN0YWRvc1VuaWRvcyBUaW1vciBTb21hbGlhIFBlcnUgUGFyYWd1YXkgTWV4aWNvIFBvbGluZXNhRnJhbmNlc2EgQ2FtYm9kaWEgWWVtZW4gVHJpbmlkYWRZVG9iYWdvIFRhaXdhbiBTcmlMYW5rYSBTdXJDb3JlYSBBcmFiaWFTYXVkaXRhIFNhbW9hIFNhblZpY2VudGVZR3JhbmFkYXMgUnVzaWEgTmlnZXJpYSBOaWNhcmFndWEgTnVldmFDYWxlZG9uaWEgSmFwb24gR3VhbSBGcmFuY2lhIEVjdWFkb3IgQ290ZWR2b2lyZSBCYXJiYWRvcyBCYW5nbGFkZXNoIEFyZ2VudGluYQoKYGBge3IsIGZpZy53aWR0aCA9IDEwLCBmaWcuaGVpZ2h0ID0gOCxlY2hvID0gRkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgpDb3VudHJ5X25hbWVzIDwtIHVuaXF1ZShEaXNfOTgkQ291bnRyeSkKCgpjb3VudHJ5Ljk4IDwtIGRhdGEuZnJhbWUoKQoKZm9yKGkgaW4gMTpsZW5ndGgoQ291bnRyeV9uYW1lcykpewogIGNvdW50cnkuOThbaSwiQ291bnRyeV9uYW1lcyJdIDwtIENvdW50cnlfbmFtZXNbaV0KICBjb3VudHJ5Ljk4W2ksICJudW1iZXJfY2FzZXMiXSA8LSBsZW5ndGgoRGlzXzk4W3doaWNoKERpc185OCRDb3VudHJ5PT1Db3VudHJ5X25hbWVzW2ldKSw5XSkKICBjb3VudHJ5Ljk4WzEzLCAibnVtYmVyX2Nhc2VzIl0gPC0gbGVuZ3RoKHdoaWNoKGlzLm5hKERpc185OCRDb3VudHJ5KT09VCkpCn0KCmNvdW50cnkuOTggPC0gdHJhbnNmb3JtKGNvdW50cnkuOTgsIENvdW50cnlfbmFtZXM9IHJlb3JkZXIoQ291bnRyeV9uYW1lcywgK251bWJlcl9jYXNlcykpCgpnZ3Bsb3QoZGF0YSA9IGNvdW50cnkuOTgsIGFlcyh4ID0gQ291bnRyeV9uYW1lcywgeSA9IG51bWJlcl9jYXNlcywgY29sb3I9Q291bnRyeV9uYW1lcykpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgZmlsbD0id2hpdGUiKSsKICBsYWJzKHg9ICJDb3VudHJ5IiwgeT0gIkRhdGEgTnVtYmVyIikrCiAgc2NhbGVfY29sb3JfZ3JleShzdGFydD0gMC43LCBlbmQ9MC4xKSsKICB0aGVtZV9jbGFzc2ljKCkrCiAgZ2d0aXRsZSgiRGlzaW1pbGFyZXMgOTglIikrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikrCiAgY29vcmRfZmxpcCgpCgpgYGAKKipGaWd1cmEgMy4qKiBQYWlzZXMgcGFyYSBzZWN1ZW5jaWFzIGRlIEdlbiBFIDk4JSBkaXNpbWlsYXJlcy4KCkluZGlhIENoaW5hIFRhaWxhbmRpYSBJbmRvbmVzaWEgU2luZ2FwdXIgVmlldE5hbSBGaWxpcGluYXMgUHVlcnRvUmljbyBQYWtpc3RhbiBNYWxhc2lhIE15YW5tYXIgQnJhemlsIEF1c3RyYWxpYSBWZW5lenVlbGEgRXN0YWRvc1VuaWRvcyBUaW1vciBTb21hbGlhIFBlcnUgUGFyYWd1YXkgTWV4aWNvIFBvbGluZXNhRnJhbmNlc2EgQ2FtYm9kaWEgWWVtZW4gVHJpbmlkYWRZVG9iYWdvIFRhaXdhbiBTcmlMYW5rYSBTdXJDb3JlYSBBcmFiaWFTYXVkaXRhIFNhbW9hIFNhblZpY2VudGVZR3JhbmFkYXMgUnVzaWEgTmlnZXJpYSBOaWNhcmFndWEgTnVldmFDYWxlZG9uaWEgSmFwb24gR3VhbSBGcmFuY2lhIEVjdWFkb3IgQ290ZWR2b2lyZSBCYXJiYWRvcyBCYW5nbGFkZXNoIEFyZ2VudGluYSBQZXJ1IEhvbmR1cmFzIENvbG9tYmlhIFBhcHVhTnVldmFHdWluZWEgIEVsU2FsdmFkb3IgSXNsYVZpcmdlbiBTdXJFc3RlQXNpYSBTYW50YUx1Y2lhIE1hcnRpbmlxdWUgTGFvcyBIYWl0aSBHcmFuYWRhIEdoYW5hIEZpamkgQW5nb2xhCgpgYGB7ciwgZmlnLndpZHRoID0gMTAsIGZpZy5oZWlnaHQgPSA5LGVjaG8gPSBGQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KCkNvdW50cnlfbmFtZXMgPC0gdW5pcXVlKERpc185OSRDb3VudHJ5KQoKCmNvdW50cnkuOTk8LSBkYXRhLmZyYW1lKCkKCmZvcihpIGluIDE6bGVuZ3RoKENvdW50cnlfbmFtZXMpKXsKICBjb3VudHJ5Ljk5W2ksIkNvdW50cnlfbmFtZXMiXSA8LSBDb3VudHJ5X25hbWVzW2ldCiAgY291bnRyeS45OVtpLCAibnVtYmVyX2Nhc2VzIl0gPC0gbGVuZ3RoKERpc185OVt3aGljaChEaXNfOTkkQ291bnRyeT09Q291bnRyeV9uYW1lc1tpXSksOV0pCiAgY291bnRyeS45OVsyNCwgIm51bWJlcl9jYXNlcyJdIDwtIGxlbmd0aCh3aGljaChpcy5uYShEaXNfOTkkQ291bnRyeSk9PVQpKQp9Cgpjb3VudHJ5Ljk5IDwtIHRyYW5zZm9ybShjb3VudHJ5Ljk5LCBDb3VudHJ5X25hbWVzPSByZW9yZGVyKENvdW50cnlfbmFtZXMsICtudW1iZXJfY2FzZXMpKQoKZ2dwbG90KGRhdGEgPSBjb3VudHJ5Ljk5LCBhZXMoeCA9IENvdW50cnlfbmFtZXMsIHkgPSBudW1iZXJfY2FzZXMsIGNvbG9yPUNvdW50cnlfbmFtZXMpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIGZpbGw9IndoaXRlIikrCiAgbGFicyh4PSAiQ291bnRyeSIsIHk9ICJEYXRhIE51bWJlciIpKwogIHNjYWxlX2NvbG9yX2dyZXkoc3RhcnQ9IDAuNywgZW5kPTAuMSkrCiAgdGhlbWVfY2xhc3NpYygpKwogIGdndGl0bGUoIkRpc2ltaWxhcmVzIDk5JSIpKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpKwogIGNvb3JkX2ZsaXAoKQoKIyBQYWlzZXMgcXVlIGZ1ZXJvbiBlbGltaW5hZG9zOgojIHNldGRpZmYoY291bnRyeS5zaW1pbGFyZXMkQ291bnRyeV9uYW1lcywgY291bnRyeS5kaXNpbWlsYXJlcyRDb3VudHJ5X25hbWVzKQoKCmBgYAoqKkZpZ3VyYSA0LioqIFBhaXNlcyBwYXJhIHNlY3VlbmNpYXMgZGUgR2VuIEUgOTklIGRpc2ltaWxhcmVzLgoKCiMjIyBNYXBhLU11bmRpOiBOdW1lcm8gZGUgY2Fzb3MgcmVwb3J0YWRvcyBwb3IgcGFpc2VzICAjIyMKCgpgYGB7ciwgZmlnLndpZHRoID0gMTAsIGZpZy5oZWlnaHQgPSAxNyxlY2hvID0gRkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgRnJlY3VlbmNpYSBkZSBsb3MgcGFpc2VzIGNvbiBzdXMgcmVzcGVjdGl2YXMgY29vcmRlbmFkYXMKIyBTSU4gRElTQ1JJTU1JTkFSIFBPUiBTRVJPVElQT1MKCmxpYnJhcnkocndvcmxkbWFwKQpsaWJyYXJ5KGdncGxvdDIpCgojIDk4CgpDb3VudHJ5X25hbWVzIDwtIHVuaXF1ZShEaXNfOTgkQ291bnRyeSkKCmZyZWcuY291bnRyeSA8LSBkYXRhLmZyYW1lKCkKCmZvcihpIGluIDE6bGVuZ3RoKENvdW50cnlfbmFtZXMpKXsKICBmcmVnLmRhdGEgPC0gRGlzXzk4W3doaWNoKERpc185OCRDb3VudHJ5ID09IENvdW50cnlfbmFtZXNbaV0pLF0KICBmcmVnLmNvdW50cnlbaSwiQ291bnRyeV9uYW1lcyJdIDwtIENvdW50cnlfbmFtZXNbaV0KICBmcmVnLmNvdW50cnlbaSwibGF0Il0gPC0gZnJlZy5kYXRhJGxhdF9jb3VudHJ5WzFdCiAgZnJlZy5jb3VudHJ5W2ksImxvbiJdIDwtIGZyZWcuZGF0YSRsb25fY291bnRyeVsxXQogIGZyZWcuY291bnRyeVtpLCAibnVtYmVyX2Nhc2VzIl0gPC0gbGVuZ3RoKGZyZWcuZGF0YSRDb3VudHJ5KQp9CgpmcmVnLmNvdW50cnkgPC0gbmEub21pdChmcmVnLmNvdW50cnkpCgojIEdSQUZJQ0EgTUFQQS1NVU5ESSBTSU4gRElGRVJFTkNJQURPIFBPUiBTRVJPVElQT1MKCm1hcC53b3JsZCA8LSBtYXBfZGF0YShtYXA9IndvcmxkIikKCnAgPC0gZ2dwbG90KCkrIAogICN0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSsKICBnZW9tX21hcChkYXRhPW1hcC53b3JsZCwgbWFwPW1hcC53b3JsZCwgYWVzKG1hcF9pZD1yZWdpb24sIHg9bG9uZywgeT1sYXQpLCBmaWxsPSJ3aGl0ZSIsIGNvbG91cj0iYmxhY2siLCBzaXplPTAuNSkrCiAgZ2VvbV9wb2ludChkYXRhPSBmcmVnLmNvdW50cnksIGFlcyh4PWxvbiwgeT1sYXQsIHNpemU9bnVtYmVyX2Nhc2VzKSwgY29sb3I9ImNvcmFsMSIgLCBhbHBoYT0wLjUpKwogIGdndGl0bGUoIkRpc2lzbWlsYXJpZGFkIDk4JSIpKwogIHNjYWxlX3NpemUobmFtZT0iTnVtYmVyIG9mIGNhc2VzIikKCgojIDk3CgpDb3VudHJ5X25hbWVzIDwtIHVuaXF1ZShEaXNfOTckQ291bnRyeSkKCmZyZWcuY291bnRyeSA8LSBkYXRhLmZyYW1lKCkKCmZvcihpIGluIDE6bGVuZ3RoKENvdW50cnlfbmFtZXMpKXsKICBmcmVnLmRhdGEgPC0gRGlzXzk3W3doaWNoKERpc185NyRDb3VudHJ5ID09IENvdW50cnlfbmFtZXNbaV0pLF0KICBmcmVnLmNvdW50cnlbaSwiQ291bnRyeV9uYW1lcyJdIDwtIENvdW50cnlfbmFtZXNbaV0KICBmcmVnLmNvdW50cnlbaSwibGF0Il0gPC0gZnJlZy5kYXRhJGxhdF9jb3VudHJ5WzFdCiAgZnJlZy5jb3VudHJ5W2ksImxvbiJdIDwtIGZyZWcuZGF0YSRsb25fY291bnRyeVsxXQogIGZyZWcuY291bnRyeVtpLCAibnVtYmVyX2Nhc2VzIl0gPC0gbGVuZ3RoKGZyZWcuZGF0YSRDb3VudHJ5KQp9CgpmcmVnLmNvdW50cnkgPC0gbmEub21pdChmcmVnLmNvdW50cnkpCgojIEdSQUZJQ0EgTUFQQS1NVU5ESSBTSU4gRElGRVJFTkNJQURPIFBPUiBTRVJPVElQT1MKCm1hcC53b3JsZCA8LSBtYXBfZGF0YShtYXA9IndvcmxkIikKCnAxIDwtIGdncGxvdCgpKyAKICAjdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikrCiAgZ2VvbV9tYXAoZGF0YT1tYXAud29ybGQsIG1hcD1tYXAud29ybGQsIGFlcyhtYXBfaWQ9cmVnaW9uLCB4PWxvbmcsIHk9bGF0KSwgZmlsbD0id2hpdGUiLCBjb2xvdXI9ImJsYWNrIiwgc2l6ZT0wLjUpKwogIGdlb21fcG9pbnQoZGF0YT0gZnJlZy5jb3VudHJ5LCBhZXMoeD1sb24sIHk9bGF0LCBzaXplPW51bWJlcl9jYXNlcyksIGNvbG9yPSJjb3JhbDEiICwgYWxwaGE9MC41KSsKICBnZ3RpdGxlKCJEaXNpc21pbGFyaWRhZCA5NyUiKSsKICBzY2FsZV9zaXplKG5hbWU9Ik51bWJlciBvZiBjYXNlcyIpCgoKIyA5OQoKQ291bnRyeV9uYW1lcyA8LSB1bmlxdWUoRGlzXzk5JENvdW50cnkpCgpmcmVnLmNvdW50cnkgPC0gZGF0YS5mcmFtZSgpCgpmb3IoaSBpbiAxOmxlbmd0aChDb3VudHJ5X25hbWVzKSl7CiAgZnJlZy5kYXRhIDwtIERpc185OVt3aGljaChEaXNfOTkkQ291bnRyeSA9PSBDb3VudHJ5X25hbWVzW2ldKSxdCiAgZnJlZy5jb3VudHJ5W2ksIkNvdW50cnlfbmFtZXMiXSA8LSBDb3VudHJ5X25hbWVzW2ldCiAgZnJlZy5jb3VudHJ5W2ksImxhdCJdIDwtIGZyZWcuZGF0YSRsYXRfY291bnRyeVsxXQogIGZyZWcuY291bnRyeVtpLCJsb24iXSA8LSBmcmVnLmRhdGEkbG9uX2NvdW50cnlbMV0KICBmcmVnLmNvdW50cnlbaSwgIm51bWJlcl9jYXNlcyJdIDwtIGxlbmd0aChmcmVnLmRhdGEkQ291bnRyeSkKfQoKZnJlZy5jb3VudHJ5IDwtIG5hLm9taXQoZnJlZy5jb3VudHJ5KQoKIyBHUkFGSUNBIE1BUEEtTVVOREkgU0lOIERJRkVSRU5DSUFETyBQT1IgU0VST1RJUE9TCgptYXAud29ybGQgPC0gbWFwX2RhdGEobWFwPSJ3b3JsZCIpCgpwMiA8LSBnZ3Bsb3QoKSsgCiAgI3RoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpKwogIGdlb21fbWFwKGRhdGE9bWFwLndvcmxkLCBtYXA9bWFwLndvcmxkLCBhZXMobWFwX2lkPXJlZ2lvbiwgeD1sb25nLCB5PWxhdCksIGZpbGw9IndoaXRlIiwgY29sb3VyPSJibGFjayIsIHNpemU9MC41KSsKICBnZW9tX3BvaW50KGRhdGE9IGZyZWcuY291bnRyeSwgYWVzKHg9bG9uLCB5PWxhdCwgc2l6ZT1udW1iZXJfY2FzZXMpLCBjb2xvcj0iY29yYWwxIiAsIGFscGhhPTAuNSkrCiAgZ2d0aXRsZSgiRGlzaXNtaWxhcmlkYWQgOTklIikrCiAgc2NhbGVfc2l6ZShuYW1lPSJOdW1iZXIgb2YgY2FzZXMiKQoKCm11bHRpcGxvdCA8LSBmdW5jdGlvbiguLi4sIHBsb3RsaXN0PU5VTEwsIGZpbGUsIGNvbHM9MSwgbGF5b3V0PU5VTEwpIHsKICBsaWJyYXJ5KGdyaWQpCgogICMgTWFrZSBhIGxpc3QgZnJvbSB0aGUgLi4uIGFyZ3VtZW50cyBhbmQgcGxvdGxpc3QKICBwbG90cyA8LSBjKGxpc3QoLi4uKSwgcGxvdGxpc3QpCgogIG51bVBsb3RzID0gbGVuZ3RoKHBsb3RzKQoKICAjIElmIGxheW91dCBpcyBOVUxMLCB0aGVuIHVzZSAnY29scycgdG8gZGV0ZXJtaW5lIGxheW91dAogIGlmIChpcy5udWxsKGxheW91dCkpIHsKICAgICMgTWFrZSB0aGUgcGFuZWwKICAgICMgbmNvbDogTnVtYmVyIG9mIGNvbHVtbnMgb2YgcGxvdHMKICAgICMgbnJvdzogTnVtYmVyIG9mIHJvd3MgbmVlZGVkLCBjYWxjdWxhdGVkIGZyb20gIyBvZiBjb2xzCiAgICBsYXlvdXQgPC0gbWF0cml4KHNlcSgxLCBjb2xzICogY2VpbGluZyhudW1QbG90cy9jb2xzKSksCiAgICAgICAgICAgICAgICAgICAgbmNvbCA9IGNvbHMsIG5yb3cgPSBjZWlsaW5nKG51bVBsb3RzL2NvbHMpKQogIH0KCiBpZiAobnVtUGxvdHM9PTEpIHsKICAgIHByaW50KHBsb3RzW1sxXV0pCgogIH0gZWxzZSB7CiAgICAjIFNldCB1cCB0aGUgcGFnZQogICAgZ3JpZC5uZXdwYWdlKCkKICAgIHB1c2hWaWV3cG9ydCh2aWV3cG9ydChsYXlvdXQgPSBncmlkLmxheW91dChucm93KGxheW91dCksIG5jb2wobGF5b3V0KSkpKQoKICAgICMgTWFrZSBlYWNoIHBsb3QsIGluIHRoZSBjb3JyZWN0IGxvY2F0aW9uCiAgICBmb3IgKGkgaW4gMTpudW1QbG90cykgewogICAgICAjIEdldCB0aGUgaSxqIG1hdHJpeCBwb3NpdGlvbnMgb2YgdGhlIHJlZ2lvbnMgdGhhdCBjb250YWluIHRoaXMgc3VicGxvdAogICAgICBtYXRjaGlkeCA8LSBhcy5kYXRhLmZyYW1lKHdoaWNoKGxheW91dCA9PSBpLCBhcnIuaW5kID0gVFJVRSkpCgogICAgICBwcmludChwbG90c1tbaV1dLCB2cCA9IHZpZXdwb3J0KGxheW91dC5wb3Mucm93ID0gbWF0Y2hpZHgkcm93LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dC5wb3MuY29sID0gbWF0Y2hpZHgkY29sKSkKICAgIH0KICB9Cn0KCgptdWx0aXBsb3QocDEscCxwMikKCmBgYAoqKkZpZ3VyYSA1LioqIE51bWVybyBkZSBjYXNvcyByZXBvcnRhZG9zIHBvciBwYWlzZXMuCgoKIyMjIE1hcGEtbXVuZGk6IFNlcm90aXBvcyBwb3IgcGFpc2VzICMjIwpgYGB7ciwgZmlnLndpZHRoID0gMTAsIGZpZy5oZWlnaHQgPSA2LGVjaG8gPSBGQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KCiMgOTcKCkNvdW50cnlfbmFtZXMgPC0gbmEub21pdCh1bmlxdWUoRGlzXzk3JENvdW50cnkpKQoKIyBGcmVjdWVuY2lhIGRlIGxvcyBzZXJvdGlwb3MgZW4gbG9zIHBhaXNlcyByZWdpc3RyYWRvczogCgojIFNFUk9USVBPIDEKCm11bmRpZF8xIDwtIGRhdGEuZnJhbWUoKQoKZm9yKGkgaW4gMTpsZW5ndGgoQ291bnRyeV9uYW1lcykpewogIG1pbmkuZGF0YSA8LSBEaXNfOTdbd2hpY2goRGlzXzk3JFNlcm90eXBlID09ICJERU5WXzEiICYgRGlzXzk3JENvdW50cnkgPT0gQ291bnRyeV9uYW1lc1tpXSksXQogIG11bmRpZF8xW2ksICJTZXJvdHlwZSJdIDwtIG1pbmkuZGF0YSRTZXJvdHlwZVsxXQogIG11bmRpZF8xW2ksIkNvdW50cnlfbmFtZXMiXSA8LSBDb3VudHJ5X25hbWVzW2ldCiAgbXVuZGlkXzFbaSwibGF0Il0gPC0gbWluaS5kYXRhJGxhdF9jb3VudHJ5WzFdCiAgbXVuZGlkXzFbaSwibG9uIl0gPC0gbWluaS5kYXRhJGxvbl9jb3VudHJ5WzFdCiAgbXVuZGlkXzFbaSwgIm51bWJlcl9jYXNlcyJdIDwtIGxlbmd0aChtaW5pLmRhdGEkQ291bnRyeSkKfQoKI1NFUk9USVBPIDIKCm11bmRpZF8yIDwtIGRhdGEuZnJhbWUoKQoKZm9yKGkgaW4gMTpsZW5ndGgoQ291bnRyeV9uYW1lcykpewogIG1pbmkuZGF0YSA8LSBEaXNfOTdbd2hpY2goRGlzXzk3JFNlcm90eXBlID09ICJERU5WXzIiICYgRGlzXzk3JENvdW50cnkgPT0gQ291bnRyeV9uYW1lc1tpXSksXQogIG11bmRpZF8yW2ksICJTZXJvdHlwZSJdIDwtIG1pbmkuZGF0YSRTZXJvdHlwZVsxXQogIG11bmRpZF8yW2ksIkNvdW50cnlfbmFtZXMiXSA8LSBDb3VudHJ5X25hbWVzW2ldCiAgbXVuZGlkXzJbaSwibGF0Il0gPC0gbWluaS5kYXRhJGxhdF9jb3VudHJ5WzFdCiAgbXVuZGlkXzJbaSwibG9uIl0gPC0gbWluaS5kYXRhJGxvbl9jb3VudHJ5WzFdCiAgbXVuZGlkXzJbaSwgIm51bWJlcl9jYXNlcyJdIDwtIGxlbmd0aChtaW5pLmRhdGEkQ291bnRyeSkKfQoKCiNTRVJPVElQTyAzCgptdW5kaWRfMyA8LSBkYXRhLmZyYW1lKCkKCmZvcihpIGluIDE6bGVuZ3RoKENvdW50cnlfbmFtZXMpKXsKICBtaW5pLmRhdGEgPC0gRGlzXzk3W3doaWNoKERpc185NyRTZXJvdHlwZSA9PSAiREVOVl8zIiAmIERpc185NyRDb3VudHJ5ID09IENvdW50cnlfbmFtZXNbaV0pLF0KICBtdW5kaWRfM1tpLCAiU2Vyb3R5cGUiXSA8LSBtaW5pLmRhdGEkU2Vyb3R5cGVbMV0KICBtdW5kaWRfM1tpLCJDb3VudHJ5X25hbWVzIl0gPC0gQ291bnRyeV9uYW1lc1tpXQogIG11bmRpZF8zW2ksImxhdCJdIDwtIG1pbmkuZGF0YSRsYXRfY291bnRyeVsxXQogIG11bmRpZF8zW2ksImxvbiJdIDwtIG1pbmkuZGF0YSRsb25fY291bnRyeVsxXQogIG11bmRpZF8zW2ksICJudW1iZXJfY2FzZXMiXSA8LSBsZW5ndGgobWluaS5kYXRhJENvdW50cnkpCn0KCgojU0VST1RJUE8gNAoKbXVuZGlkXzQgPC0gZGF0YS5mcmFtZSgpCgpmb3IoaSBpbiAxOmxlbmd0aChDb3VudHJ5X25hbWVzKSl7CiAgbWluaS5kYXRhIDwtIERpc185N1t3aGljaChEaXNfOTckU2Vyb3R5cGUgPT0gIkRFTlZfNCIgJiBEaXNfOTckQ291bnRyeSA9PSBDb3VudHJ5X25hbWVzW2ldKSxdCiAgbXVuZGlkXzRbaSwgIlNlcm90eXBlIl0gPC0gbWluaS5kYXRhJFNlcm90eXBlWzFdCiAgbXVuZGlkXzRbaSwiQ291bnRyeV9uYW1lcyJdIDwtIENvdW50cnlfbmFtZXNbaV0KICBtdW5kaWRfNFtpLCJsYXQiXSA8LSBtaW5pLmRhdGEkbGF0X2NvdW50cnlbMV0KICBtdW5kaWRfNFtpLCJsb24iXSA8LSBtaW5pLmRhdGEkbG9uX2NvdW50cnlbMV0KICBtdW5kaWRfNFtpLCAibnVtYmVyX2Nhc2VzIl0gPC0gbGVuZ3RoKG1pbmkuZGF0YSRDb3VudHJ5KQp9CgoKCmRhdGEubXVuZGkgPC0gcmJpbmQobXVuZGlkXzEsbXVuZGlkXzIsbXVuZGlkXzMsbXVuZGlkXzQpCmRhdGEubXVuZGkgPC0gbmEub21pdChkYXRhLm11bmRpKQoKIyBHUkFGSUNBIE1BUEEtTVVOREkgRElGRVJFTkNJQURPIFBPUiBTRVJPVElQT1MKCm1hcC53b3JsZCA8LSBtYXBfZGF0YShtYXA9IndvcmxkIikKCm1wMSA8LSBnZ3Bsb3QoKSsgCiAgZ2VvbV9tYXAoZGF0YT1tYXAud29ybGQsIG1hcD1tYXAud29ybGQsIGFlcyhtYXBfaWQ9cmVnaW9uLCB4PWxvbmcsIHk9bGF0KSwgZmlsbD0id2hpdGUiLCBjb2xvdXI9ImJsYWNrIiwgc2l6ZT0wLjUpKwogIGdndGl0bGUoIlBhaXNlczogRGlzaW1pbGFyaWRhZCA5NyUiKSsKICBnZW9tX3BvaW50KGRhdGE9IGRhdGEubXVuZGksIGFlcyh4PWxvbiwgeT1sYXQsIGNvbG9yPVNlcm90eXBlKSxzaXplPTEuNSwgYWxwaGE9MC41KSsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoInR1cnF1b2lzZTMiLCJkZWVwcGluayIsIm1lZGl1bWJsdWUiLCJncmVlbjMiKSkKCm1wMQoKYGBgCioqRmlndXJhIDYuKiogRGlzdHJpYnVjaW9uIGRlIGxvcyBzZXJvdGlwb3MgcG9yIHBhaXNlcyBwYXJhIHNlY3VlbmNpYXMgOTclIGRpc2ltaWxhcmVzLgoKCgpgYGB7ciwgZmlnLndpZHRoID0gMTAsIGZpZy5oZWlnaHQgPSA2LGVjaG8gPSBGQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KCiMgOTgKCkNvdW50cnlfbmFtZXMgPC0gbmEub21pdCh1bmlxdWUoRGlzXzk4JENvdW50cnkpKQoKIyBGcmVjdWVuY2lhIGRlIGxvcyBzZXJvdGlwb3MgZW4gbG9zIHBhaXNlcyByZWdpc3RyYWRvczogCgojIFNFUk9USVBPIDEKCm11bmRpc18xIDwtIGRhdGEuZnJhbWUoKQoKZm9yKGkgaW4gMTpsZW5ndGgoQ291bnRyeV9uYW1lcykpewogIG1pbmkuZGF0YSA8LSBEaXNfOThbd2hpY2goRGlzXzk4JFNlcm90eXBlID09ICJERU5WXzEiICYgRGlzXzk4JENvdW50cnkgPT0gQ291bnRyeV9uYW1lc1tpXSksXQogIG11bmRpc18xW2ksICJTZXJvdHlwZSJdIDwtIG1pbmkuZGF0YSRTZXJvdHlwZVsxXQogIG11bmRpc18xW2ksIkNvdW50cnlfbmFtZXMiXSA8LSBDb3VudHJ5X25hbWVzW2ldCiAgbXVuZGlzXzFbaSwibGF0Il0gPC0gbWluaS5kYXRhJGxhdF9jb3VudHJ5WzFdCiAgbXVuZGlzXzFbaSwibG9uIl0gPC0gbWluaS5kYXRhJGxvbl9jb3VudHJ5WzFdCiAgbXVuZGlzXzFbaSwgIm51bWJlcl9jYXNlcyJdIDwtIGxlbmd0aChtaW5pLmRhdGEkQ291bnRyeSkKfQoKI1NFUk9USVBPIDIKCm11bmRpc18yIDwtIGRhdGEuZnJhbWUoKQoKZm9yKGkgaW4gMTpsZW5ndGgoQ291bnRyeV9uYW1lcykpewogIG1pbmkuZGF0YSA8LSBEaXNfOThbd2hpY2goRGlzXzk4JFNlcm90eXBlID09ICJERU5WXzIiICYgRGlzXzk4JENvdW50cnkgPT0gQ291bnRyeV9uYW1lc1tpXSksXQogIG11bmRpc18yW2ksICJTZXJvdHlwZSJdIDwtIG1pbmkuZGF0YSRTZXJvdHlwZVsxXQogIG11bmRpc18yW2ksIkNvdW50cnlfbmFtZXMiXSA8LSBDb3VudHJ5X25hbWVzW2ldCiAgbXVuZGlzXzJbaSwibGF0Il0gPC0gbWluaS5kYXRhJGxhdF9jb3VudHJ5WzFdCiAgbXVuZGlzXzJbaSwibG9uIl0gPC0gbWluaS5kYXRhJGxvbl9jb3VudHJ5WzFdCiAgbXVuZGlzXzJbaSwgIm51bWJlcl9jYXNlcyJdIDwtIGxlbmd0aChtaW5pLmRhdGEkQ291bnRyeSkKfQoKCiNTRVJPVElQTyAzCgptdW5kaXNfMyA8LSBkYXRhLmZyYW1lKCkKCmZvcihpIGluIDE6bGVuZ3RoKENvdW50cnlfbmFtZXMpKXsKICBtaW5pLmRhdGEgPC0gRGlzXzk4W3doaWNoKERpc185OCRTZXJvdHlwZSA9PSAiREVOVl8zIiAmIERpc185OCRDb3VudHJ5ID09IENvdW50cnlfbmFtZXNbaV0pLF0KICBtdW5kaXNfM1tpLCAiU2Vyb3R5cGUiXSA8LSBtaW5pLmRhdGEkU2Vyb3R5cGVbMV0KICBtdW5kaXNfM1tpLCJDb3VudHJ5X25hbWVzIl0gPC0gQ291bnRyeV9uYW1lc1tpXQogIG11bmRpc18zW2ksImxhdCJdIDwtIG1pbmkuZGF0YSRsYXRfY291bnRyeVsxXQogIG11bmRpc18zW2ksImxvbiJdIDwtIG1pbmkuZGF0YSRsb25fY291bnRyeVsxXQogIG11bmRpc18zW2ksICJudW1iZXJfY2FzZXMiXSA8LSBsZW5ndGgobWluaS5kYXRhJENvdW50cnkpCn0KCgojU0VST1RJUE8gNAoKbXVuZGlzXzQgPC0gZGF0YS5mcmFtZSgpCgpmb3IoaSBpbiAxOmxlbmd0aChDb3VudHJ5X25hbWVzKSl7CiAgbWluaS5kYXRhIDwtIERpc185OFt3aGljaChEaXNfOTgkU2Vyb3R5cGUgPT0gIkRFTlZfNCIgJiBEaXNfOTgkQ291bnRyeSA9PSBDb3VudHJ5X25hbWVzW2ldKSxdCiAgbXVuZGlzXzRbaSwgIlNlcm90eXBlIl0gPC0gbWluaS5kYXRhJFNlcm90eXBlWzFdCiAgbXVuZGlzXzRbaSwiQ291bnRyeV9uYW1lcyJdIDwtIENvdW50cnlfbmFtZXNbaV0KICBtdW5kaXNfNFtpLCJsYXQiXSA8LSBtaW5pLmRhdGEkbGF0X2NvdW50cnlbMV0KICBtdW5kaXNfNFtpLCJsb24iXSA8LSBtaW5pLmRhdGEkbG9uX2NvdW50cnlbMV0KICBtdW5kaXNfNFtpLCAibnVtYmVyX2Nhc2VzIl0gPC0gbGVuZ3RoKG1pbmkuZGF0YSRDb3VudHJ5KQp9CgoKCmRhdGEubXVuZGkgPC0gcmJpbmQobXVuZGlzXzEsbXVuZGlzXzIsbXVuZGlzXzMsbXVuZGlzXzQpCmRhdGEubXVuZGkgPC0gbmEub21pdChkYXRhLm11bmRpKQoKIyBHUkFGSUNBIE1BUEEtTVVOREkgRElGRVJFTkNJQURPIFBPUiBTRVJPVElQT1MKCm1hcC53b3JsZCA8LSBtYXBfZGF0YShtYXA9IndvcmxkIikKCm1wIDwtZ2dwbG90KCkrIAogIGdlb21fbWFwKGRhdGE9bWFwLndvcmxkLCBtYXA9bWFwLndvcmxkLCBhZXMobWFwX2lkPXJlZ2lvbiwgeD1sb25nLCB5PWxhdCksIGZpbGw9IndoaXRlIiwgY29sb3VyPSJibGFjayIsIHNpemU9MC41KSsKICBnZ3RpdGxlKCJQYWlzZXM6IERpc2ltaWxhcmlkYWQgOTglIikrCiAgZ2VvbV9wb2ludChkYXRhPSBkYXRhLm11bmRpLCBhZXMoeD1sb24sIHk9bGF0LCBjb2xvcj1TZXJvdHlwZSksc2l6ZT0xLjUsIGFscGhhPTAuNSkrCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCJ0dXJxdW9pc2UzIiwiZGVlcHBpbmsiLCJtZWRpdW1ibHVlIiwiZ3JlZW4zIikpCgptcAoKYGBgCioqRmlndXJhIDcuKiogRGlzdHJpYnVjaW9uIGRlIGxvcyBzZXJvdGlwb3MgcG9yIHBhaXNlcyBwYXJhIHNlY3VlbmNpYXMgOTglIGRpc2ltaWxhcmVzLgoKYGBge3IsIGZpZy53aWR0aCA9IDEwLCBmaWcuaGVpZ2h0ID0gNixlY2hvID0gRkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgojIDk5CgpDb3VudHJ5X25hbWVzIDwtIG5hLm9taXQodW5pcXVlKERpc185OSRDb3VudHJ5KSkKCiMgRnJlY3VlbmNpYSBkZSBsb3Mgc2Vyb3RpcG9zIGVuIGxvcyBwYWlzZXMgcmVnaXN0cmFkb3M6IAoKIyBTRVJPVElQTyAxCgptdW5kaWRfMSA8LSBkYXRhLmZyYW1lKCkKCmZvcihpIGluIDE6bGVuZ3RoKENvdW50cnlfbmFtZXMpKXsKICBtaW5pLmRhdGEgPC0gRGlzXzk5W3doaWNoKERpc185OSRTZXJvdHlwZSA9PSAiREVOVl8xIiAmIERpc185OSRDb3VudHJ5ID09IENvdW50cnlfbmFtZXNbaV0pLF0KICBtdW5kaWRfMVtpLCAiU2Vyb3R5cGUiXSA8LSBtaW5pLmRhdGEkU2Vyb3R5cGVbMV0KICBtdW5kaWRfMVtpLCJDb3VudHJ5X25hbWVzIl0gPC0gQ291bnRyeV9uYW1lc1tpXQogIG11bmRpZF8xW2ksImxhdCJdIDwtIG1pbmkuZGF0YSRsYXRfY291bnRyeVsxXQogIG11bmRpZF8xW2ksImxvbiJdIDwtIG1pbmkuZGF0YSRsb25fY291bnRyeVsxXQogIG11bmRpZF8xW2ksICJudW1iZXJfY2FzZXMiXSA8LSBsZW5ndGgobWluaS5kYXRhJENvdW50cnkpCn0KCiNTRVJPVElQTyAyCgptdW5kaWRfMiA8LSBkYXRhLmZyYW1lKCkKCmZvcihpIGluIDE6bGVuZ3RoKENvdW50cnlfbmFtZXMpKXsKICBtaW5pLmRhdGEgPC0gRGlzXzk5W3doaWNoKERpc185OSRTZXJvdHlwZSA9PSAiREVOVl8yIiAmIERpc185OSRDb3VudHJ5ID09IENvdW50cnlfbmFtZXNbaV0pLF0KICBtdW5kaWRfMltpLCAiU2Vyb3R5cGUiXSA8LSBtaW5pLmRhdGEkU2Vyb3R5cGVbMV0KICBtdW5kaWRfMltpLCJDb3VudHJ5X25hbWVzIl0gPC0gQ291bnRyeV9uYW1lc1tpXQogIG11bmRpZF8yW2ksImxhdCJdIDwtIG1pbmkuZGF0YSRsYXRfY291bnRyeVsxXQogIG11bmRpZF8yW2ksImxvbiJdIDwtIG1pbmkuZGF0YSRsb25fY291bnRyeVsxXQogIG11bmRpZF8yW2ksICJudW1iZXJfY2FzZXMiXSA8LSBsZW5ndGgobWluaS5kYXRhJENvdW50cnkpCn0KCgojU0VST1RJUE8gMwoKbXVuZGlkXzMgPC0gZGF0YS5mcmFtZSgpCgpmb3IoaSBpbiAxOmxlbmd0aChDb3VudHJ5X25hbWVzKSl7CiAgbWluaS5kYXRhIDwtIERpc185OVt3aGljaChEaXNfOTkkU2Vyb3R5cGUgPT0gIkRFTlZfMyIgJiBEaXNfOTkkQ291bnRyeSA9PSBDb3VudHJ5X25hbWVzW2ldKSxdCiAgbXVuZGlkXzNbaSwgIlNlcm90eXBlIl0gPC0gbWluaS5kYXRhJFNlcm90eXBlWzFdCiAgbXVuZGlkXzNbaSwiQ291bnRyeV9uYW1lcyJdIDwtIENvdW50cnlfbmFtZXNbaV0KICBtdW5kaWRfM1tpLCJsYXQiXSA8LSBtaW5pLmRhdGEkbGF0X2NvdW50cnlbMV0KICBtdW5kaWRfM1tpLCJsb24iXSA8LSBtaW5pLmRhdGEkbG9uX2NvdW50cnlbMV0KICBtdW5kaWRfM1tpLCAibnVtYmVyX2Nhc2VzIl0gPC0gbGVuZ3RoKG1pbmkuZGF0YSRDb3VudHJ5KQp9CgoKI1NFUk9USVBPIDQKCm11bmRpZF80IDwtIGRhdGEuZnJhbWUoKQoKZm9yKGkgaW4gMTpsZW5ndGgoQ291bnRyeV9uYW1lcykpewogIG1pbmkuZGF0YSA8LSBEaXNfOTlbd2hpY2goRGlzXzk5JFNlcm90eXBlID09ICJERU5WXzQiICYgRGlzXzk5JENvdW50cnkgPT0gQ291bnRyeV9uYW1lc1tpXSksXQogIG11bmRpZF80W2ksICJTZXJvdHlwZSJdIDwtIG1pbmkuZGF0YSRTZXJvdHlwZVsxXQogIG11bmRpZF80W2ksIkNvdW50cnlfbmFtZXMiXSA8LSBDb3VudHJ5X25hbWVzW2ldCiAgbXVuZGlkXzRbaSwibGF0Il0gPC0gbWluaS5kYXRhJGxhdF9jb3VudHJ5WzFdCiAgbXVuZGlkXzRbaSwibG9uIl0gPC0gbWluaS5kYXRhJGxvbl9jb3VudHJ5WzFdCiAgbXVuZGlkXzRbaSwgIm51bWJlcl9jYXNlcyJdIDwtIGxlbmd0aChtaW5pLmRhdGEkQ291bnRyeSkKfQoKCgpkYXRhLm11bmRpMiA8LSByYmluZChtdW5kaWRfMSxtdW5kaWRfMixtdW5kaWRfMyxtdW5kaWRfNCkKZGF0YS5tdW5kaTIgPC0gbmEub21pdChkYXRhLm11bmRpKQoKIyBHUkFGSUNBIE1BUEEtTVVOREkgRElGRVJFTkNJQURPIFBPUiBTRVJPVElQT1MKCm1hcC53b3JsZCA8LSBtYXBfZGF0YShtYXA9IndvcmxkIikKCm1wMiA8LSBnZ3Bsb3QoKSsgCiAgZ2VvbV9tYXAoZGF0YT1tYXAud29ybGQsIG1hcD1tYXAud29ybGQsIGFlcyhtYXBfaWQ9cmVnaW9uLCB4PWxvbmcsIHk9bGF0KSwgZmlsbD0id2hpdGUiLCBjb2xvdXI9ImJsYWNrIiwgc2l6ZT0wLjUpKwogIGdndGl0bGUoIlBhaXNlczogRGlzaW1pbGFyaWRhZCA5OSUiKSsKICBnZW9tX3BvaW50KGRhdGE9IGRhdGEubXVuZGkyLCBhZXMoeD1sb24sIHk9bGF0LCBjb2xvcj1TZXJvdHlwZSksc2l6ZT0xLjUsIGFscGhhPTAuNSkrCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCJ0dXJxdW9pc2UzIiwiZGVlcHBpbmsiLCJtZWRpdW1ibHVlIiwiZ3JlZW4zIikpCgoKbXAyCgpgYGAKKipGaWd1cmEgOC4qKiBEaXN0cmlidWNpb24gZGUgbG9zIHNlcm90aXBvcyBwb3IgcGFpc2VzIHBhcmEgc2VjdWVuY2lhcyA5OSUgZGlzaW1pbGFyZXMuCgoKIyMjIExvY2FsaWRhZGVzOiBEaXNpbWlsYXJpZGFkIDk3JSAjIyMKCmBgYHtyLCBlY2hvID0gRkFMU0UsIGZpZy53aWR0aD05LCBmaWcuaGVpZ2h0PTUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgpsaWJyYXJ5KHRtKQpsaWJyYXJ5KFNub3diYWxsQykKbGlicmFyeSh3b3JkY2xvdWQpCmxpYnJhcnkoIlJDb2xvckJyZXdlciIpCgpsb2NhdGlvbiA8LSBEaXNfOTdbd2hpY2goaXMubmEoRGlzXzk3JExvY2F0aW9uKT09RiksMTBdCgpsb2NhdGlvbiA8LSBnc3ViKCIgIiwgIiIsIGxvY2F0aW9uKQoKbG9jb3JwdXMgPC0gQ29ycHVzKFZlY3RvclNvdXJjZShsb2NhdGlvbikpCgp0b1NwYWNlIDwtIGNvbnRlbnRfdHJhbnNmb3JtZXIoZnVuY3Rpb24gKHggLCBwYXR0ZXJuICkgZ3N1YihwYXR0ZXJuLCAiICIsIHgpKQpsb2NvcnB1cyA8LSB0bV9tYXAobG9jb3JwdXMsIHRvU3BhY2UsICIvIikKbG9jb3JwdXMgPC0gdG1fbWFwKGxvY29ycHVzLCB0b1NwYWNlLCAiLSIpCmxvY29ycHVzIDwtIHRtX21hcChsb2NvcnB1cywgdG9TcGFjZSwgIi0tIikKCmxvY29ycHVzIDwtIHRtX21hcChsb2NvcnB1cywgY29udGVudF90cmFuc2Zvcm1lcih0b2xvd2VyKSkKCmxvY29ycHVzIDwtIHRtX21hcChsb2NvcnB1cywgcmVtb3ZlTnVtYmVycykKCmxvY29ycHVzIDwtIHRtX21hcChsb2NvcnB1cywgcmVtb3ZlV29yZHMsIHN0b3B3b3JkcygnZW5nbGlzaCcpKQoKbG9jb3JwdXMgPC0gdG1fbWFwKGxvY29ycHVzLCByZW1vdmVXb3JkcywgYygiYmxhYmxhMSIsICJibGFibGEyIikpIAoKbG9jb3JwdXMgPC0gdG1fbWFwKGxvY29ycHVzLCByZW1vdmVQdW5jdHVhdGlvbikKCmxvY29ycHVzIDwtIHRtX21hcChsb2NvcnB1cywgc3RyaXBXaGl0ZXNwYWNlKQoKZHRtIDwtIFRlcm1Eb2N1bWVudE1hdHJpeChsb2NvcnB1cykKbG9tYXggPC0gYXMubWF0cml4KGR0bSkKdmNhdGlvbiA8LSBzb3J0KHJvd1N1bXMobG9tYXgpLGRlY3JlYXNpbmc9VFJVRSkKbG9mcmFtZSA8LSBkYXRhLmZyYW1lKHdvcmQgPSBuYW1lcyh2Y2F0aW9uKSxmcmVxPXZjYXRpb24pCgoKd29yZGNsb3VkKHdvcmRzID0gbG9mcmFtZSR3b3JkLCBmcmVxID0gbG9mcmFtZSRmcmVxLCBzY2FsZSA9IGMoNCwxKSwgbWluLmZyZXEgPSAyLAogICAgICAgICAgbWF4LndvcmRzPTIwMDAsIHJhbmRvbS5vcmRlcj1GQUxTRSwgcm90LnBlcj0wLjQ1LAogICAgICAgICAgY29sb3JzPWJyZXdlci5wYWwoMTIsICJQYWlyZWQiKSkKCgpgYGAKKipGaWd1cmEgOS4qKiBOdWJlIGRlIGxvY2FsaWRhZGVzIHBhcmEgc2VjdWVjaWFzIGRlbCBHZW4gRSA5NyUgRGlzaW1pbGFyZXMuCgojIyMgTG9jYWxpZGFkZXM6IERpc2ltaWxhcmlkYWQgOTglICMjIwoKYGBge3IsIGVjaG8gPSBGQUxTRSwgZmlnLndpZHRoPTksIGZpZy5oZWlnaHQ9NSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KCmxpYnJhcnkodG0pCmxpYnJhcnkoU25vd2JhbGxDKQpsaWJyYXJ5KHdvcmRjbG91ZCkKbGlicmFyeSgiUkNvbG9yQnJld2VyIikKCmxvY2F0aW9uIDwtIERpc185OFt3aGljaChpcy5uYShEaXNfOTgkTG9jYXRpb24pPT1GKSwxMF0KCmxvY2F0aW9uIDwtIGdzdWIoIiAiLCAiIiwgbG9jYXRpb24pCgpsb2NvcnB1cyA8LSBDb3JwdXMoVmVjdG9yU291cmNlKGxvY2F0aW9uKSkKCnRvU3BhY2UgPC0gY29udGVudF90cmFuc2Zvcm1lcihmdW5jdGlvbiAoeCAsIHBhdHRlcm4gKSBnc3ViKHBhdHRlcm4sICIgIiwgeCkpCmxvY29ycHVzIDwtIHRtX21hcChsb2NvcnB1cywgdG9TcGFjZSwgIi8iKQpsb2NvcnB1cyA8LSB0bV9tYXAobG9jb3JwdXMsIHRvU3BhY2UsICItIikKbG9jb3JwdXMgPC0gdG1fbWFwKGxvY29ycHVzLCB0b1NwYWNlLCAiLS0iKQoKbG9jb3JwdXMgPC0gdG1fbWFwKGxvY29ycHVzLCBjb250ZW50X3RyYW5zZm9ybWVyKHRvbG93ZXIpKQoKbG9jb3JwdXMgPC0gdG1fbWFwKGxvY29ycHVzLCByZW1vdmVOdW1iZXJzKQoKbG9jb3JwdXMgPC0gdG1fbWFwKGxvY29ycHVzLCByZW1vdmVXb3Jkcywgc3RvcHdvcmRzKCdlbmdsaXNoJykpCgpsb2NvcnB1cyA8LSB0bV9tYXAobG9jb3JwdXMsIHJlbW92ZVdvcmRzLCBjKCJibGFibGExIiwgImJsYWJsYTIiKSkgCgpsb2NvcnB1cyA8LSB0bV9tYXAobG9jb3JwdXMsIHJlbW92ZVB1bmN0dWF0aW9uKQoKbG9jb3JwdXMgPC0gdG1fbWFwKGxvY29ycHVzLCBzdHJpcFdoaXRlc3BhY2UpCgpkdG0gPC0gVGVybURvY3VtZW50TWF0cml4KGxvY29ycHVzKQpsb21heCA8LSBhcy5tYXRyaXgoZHRtKQp2Y2F0aW9uIDwtIHNvcnQocm93U3Vtcyhsb21heCksZGVjcmVhc2luZz1UUlVFKQpsb2ZyYW1lIDwtIGRhdGEuZnJhbWUod29yZCA9IG5hbWVzKHZjYXRpb24pLGZyZXE9dmNhdGlvbikKCgp3b3JkY2xvdWQod29yZHMgPSBsb2ZyYW1lJHdvcmQsIGZyZXEgPSBsb2ZyYW1lJGZyZXEsIHNjYWxlID0gYyg0LDEpLCBtaW4uZnJlcSA9IDIsCiAgICAgICAgICBtYXgud29yZHM9MjAwMCwgcmFuZG9tLm9yZGVyPUZBTFNFLCByb3QucGVyPTAuNDUsCiAgICAgICAgICBjb2xvcnM9YnJld2VyLnBhbCgxMiwgIlBhaXJlZCIpKQoKCmBgYAoqKkZpZ3VyYSAxMC4qKiBOdWJlIGRlIGxvY2FsaWRhZGVzIHBhcmEgc2VjdWVjaWFzIGRlbCBHZW4gRSA5OCUgRGlzaW1pbGFyZXMuCgojIyMgTG9jYWxpZGFkZXM6IERpc2ltaWxhcmlkYWQgOTklICMjIwoKYGBge3IsIGVjaG8gPSBGQUxTRSwgZmlnLndpZHRoPTksIGZpZy5oZWlnaHQ9NSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KCmxpYnJhcnkodG0pCmxpYnJhcnkoU25vd2JhbGxDKQpsaWJyYXJ5KHdvcmRjbG91ZCkKbGlicmFyeSgiUkNvbG9yQnJld2VyIikKCmxvY2F0aW9uIDwtIERpc185OVt3aGljaChpcy5uYShEaXNfOTkkTG9jYXRpb24pPT1GKSwxMF0KCmxvY2F0aW9uIDwtIGdzdWIoIiAiLCAiIiwgbG9jYXRpb24pCgpsb2NvcnB1cyA8LSBDb3JwdXMoVmVjdG9yU291cmNlKGxvY2F0aW9uKSkKCnRvU3BhY2UgPC0gY29udGVudF90cmFuc2Zvcm1lcihmdW5jdGlvbiAoeCAsIHBhdHRlcm4gKSBnc3ViKHBhdHRlcm4sICIgIiwgeCkpCmxvY29ycHVzIDwtIHRtX21hcChsb2NvcnB1cywgdG9TcGFjZSwgIi8iKQpsb2NvcnB1cyA8LSB0bV9tYXAobG9jb3JwdXMsIHRvU3BhY2UsICItIikKbG9jb3JwdXMgPC0gdG1fbWFwKGxvY29ycHVzLCB0b1NwYWNlLCAiLS0iKQoKbG9jb3JwdXMgPC0gdG1fbWFwKGxvY29ycHVzLCBjb250ZW50X3RyYW5zZm9ybWVyKHRvbG93ZXIpKQoKbG9jb3JwdXMgPC0gdG1fbWFwKGxvY29ycHVzLCByZW1vdmVOdW1iZXJzKQoKbG9jb3JwdXMgPC0gdG1fbWFwKGxvY29ycHVzLCByZW1vdmVXb3Jkcywgc3RvcHdvcmRzKCdlbmdsaXNoJykpCgpsb2NvcnB1cyA8LSB0bV9tYXAobG9jb3JwdXMsIHJlbW92ZVdvcmRzLCBjKCJibGFibGExIiwgImJsYWJsYTIiKSkgCgpsb2NvcnB1cyA8LSB0bV9tYXAobG9jb3JwdXMsIHJlbW92ZVB1bmN0dWF0aW9uKQoKbG9jb3JwdXMgPC0gdG1fbWFwKGxvY29ycHVzLCBzdHJpcFdoaXRlc3BhY2UpCgpkdG0gPC0gVGVybURvY3VtZW50TWF0cml4KGxvY29ycHVzKQpsb21heCA8LSBhcy5tYXRyaXgoZHRtKQp2Y2F0aW9uIDwtIHNvcnQocm93U3Vtcyhsb21heCksZGVjcmVhc2luZz1UUlVFKQpsb2ZyYW1lIDwtIGRhdGEuZnJhbWUod29yZCA9IG5hbWVzKHZjYXRpb24pLGZyZXE9dmNhdGlvbikKCgp3b3JkY2xvdWQod29yZHMgPSBsb2ZyYW1lJHdvcmQsIGZyZXEgPSBsb2ZyYW1lJGZyZXEsIHNjYWxlID0gYyg0LDEpLCBtaW4uZnJlcSA9IDIsCiAgICAgICAgICBtYXgud29yZHM9MjAwMCwgcmFuZG9tLm9yZGVyPUZBTFNFLCByb3QucGVyPTAuNDUsCiAgICAgICAgICBjb2xvcnM9YnJld2VyLnBhbCgxMiwgIlBhaXJlZCIpKQoKCmBgYAoqKkZpZ3VyYSAxMS4qKiBOdWJlIGRlIGxvY2FsaWRhZGVzIHBhcmEgc2VjdWVjaWFzIGRlbCBHZW4gRSA5OSUgRGlzaW1pbGFyZXMuCgoKIyMjIE1hcGEtbXVuZGkgbG9jYWxpZGFkZXMgOTclIERpc2ltaWxhcmlkYWQgIyMjCgpgYGB7ciwgZWNobyA9IEZBTFNFLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9NiwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KCmxvY2F0aW9uIDwtIHdoaWNoKGlzLm5hKERpc185NyRMb2NhdGlvbik9PUYpCgpuYW1lc19sb2NhdGlvbiA8LSB1bmlxdWUoRGlzXzk3W3doaWNoKGlzLm5hKERpc185NyRMb2NhdGlvbik9PUYpLDEwXSkKCmxvY2F0aW9uX2NvdW50cnlfYWxsIDwtIHZlY3RvcigpCgpmb3IoaSBpbiAxOmxlbmd0aChsb2NhdGlvbikpewogIGxvY2F0aW9uX2NvdW50cnlfYWxsW2ldIDwtICBwYXN0ZShEaXNfOTckTG9jYXRpb25bbG9jYXRpb25baV1dLCIsIixEaXNfOTckQ291bnRyeVtsb2NhdGlvbltpXV0sIHNlcCA9ICIiKQp9CgoKbG9jYXRpb25fY291bnRyeSA8LSB1bmlxdWUobG9jYXRpb25fY291bnRyeV9hbGwpCgojIFNFUk9USVBPIDEKClNEMSA8LSBkYXRhLmZyYW1lKCkKCmZvcihpIGluIDE6bGVuZ3RoKG5hbWVzX2xvY2F0aW9uKSl7CiAgbWluaS5kYXRhIDwtIERpc185N1t3aGljaChEaXNfOTckU2Vyb3R5cGU9PSJERU5WXzEiICYgRGlzXzk3JExvY2F0aW9uPT1uYW1lc19sb2NhdGlvbltpXSksXQogIFNEMVtpLCAiU2Vyb3R5cGUiXSA8LSBtaW5pLmRhdGEkU2Vyb3R5cGVbMV0KICBTRDFbaSwibG9jYXRpb25fbmFtZXMiXSA8LSBsb2NhdGlvbl9jb3VudHJ5W2ldCiAgU0QxW2ksICJsYXQiXSA8LSBtaW5pLmRhdGEkbGF0X2xvY2F0aW9uWzFdCiAgU0QxW2ksICJsb24iXSA8LSBtaW5pLmRhdGEkbG9uX2xvY2F0aW9uWzFdCiAgU0QxW2ksICJudW1iZXJfY2FzZXMiXSA8LSBsZW5ndGgobWluaS5kYXRhJExvY2F0aW9uKQp9CgpTRDE8LSBuYS5vbWl0KFNEMSkKCiMgU0VST1RJUE8gMgoKU0QyIDwtIGRhdGEuZnJhbWUoKQoKZm9yKGkgaW4gMTpsZW5ndGgobmFtZXNfbG9jYXRpb24pKXsKICBtaW5pLmRhdGEgPC0gRGlzXzk3W3doaWNoKERpc185NyRTZXJvdHlwZT09IkRFTlZfMiIgJiBEaXNfOTckTG9jYXRpb249PW5hbWVzX2xvY2F0aW9uW2ldKSxdCiAgU0QyW2ksICJTZXJvdHlwZSJdIDwtIG1pbmkuZGF0YSRTZXJvdHlwZVsxXQogIFNEMltpLCJsb2NhdGlvbl9uYW1lcyJdIDwtIGxvY2F0aW9uX2NvdW50cnlbaV0KICBTRDJbaSwgImxhdCJdIDwtIG1pbmkuZGF0YSRsYXRfbG9jYXRpb25bMV0KICBTRDJbaSwgImxvbiJdIDwtIG1pbmkuZGF0YSRsb25fbG9jYXRpb25bMV0KICBTRDJbaSwgIm51bWJlcl9jYXNlcyJdIDwtIGxlbmd0aChtaW5pLmRhdGEkTG9jYXRpb24pCn0KClNEMjwtIG5hLm9taXQoU0QyKQoKIyBTRVJPVElQRSAzCgpTRDMgPC0gZGF0YS5mcmFtZSgpCgpmb3IoaSBpbiAxOmxlbmd0aChuYW1lc19sb2NhdGlvbikpewogIG1pbmkuZGF0YSA8LSBEaXNfOTdbd2hpY2goRGlzXzk3JFNlcm90eXBlPT0iREVOVl8zIiAmIERpc185NyRMb2NhdGlvbj09bmFtZXNfbG9jYXRpb25baV0pLF0KICBTRDNbaSwgIlNlcm90eXBlIl0gPC0gbWluaS5kYXRhJFNlcm90eXBlWzFdCiAgU0QzW2ksImxvY2F0aW9uX25hbWVzIl0gPC0gbG9jYXRpb25fY291bnRyeVtpXQogIFNEM1tpLCAibGF0Il0gPC0gbWluaS5kYXRhJGxhdF9sb2NhdGlvblsxXQogIFNEM1tpLCAibG9uIl0gPC0gbWluaS5kYXRhJGxvbl9sb2NhdGlvblsxXQogIFNEM1tpLCAibnVtYmVyX2Nhc2VzIl0gPC0gbGVuZ3RoKG1pbmkuZGF0YSRMb2NhdGlvbikKfQoKU0QzPC0gbmEub21pdChTRDMpCgojIFNFUk9USVBFIDQKClNENCA8LSBkYXRhLmZyYW1lKCkKCmZvcihpIGluIDE6bGVuZ3RoKG5hbWVzX2xvY2F0aW9uKSl7CiAgbWluaS5kYXRhIDwtIERpc185N1t3aGljaChEaXNfOTckU2Vyb3R5cGU9PSJERU5WXzQiICYgRGlzXzk3JExvY2F0aW9uPT1uYW1lc19sb2NhdGlvbltpXSksXQogIFNENFtpLCAiU2Vyb3R5cGUiXSA8LSBtaW5pLmRhdGEkU2Vyb3R5cGVbMV0KICBTRDRbaSwibG9jYXRpb25fbmFtZXMiXSA8LSBsb2NhdGlvbl9jb3VudHJ5W2ldCiAgU0Q0W2ksICJsYXQiXSA8LSBtaW5pLmRhdGEkbGF0X2xvY2F0aW9uWzFdCiAgU0Q0W2ksICJsb24iXSA8LSBtaW5pLmRhdGEkbG9uX2xvY2F0aW9uWzFdCiAgU0Q0W2ksICJudW1iZXJfY2FzZXMiXSA8LSBsZW5ndGgobWluaS5kYXRhJExvY2F0aW9uKQp9CgpTRDQ8LSBuYS5vbWl0KFNENCkKCm11bmRpLmxvY2F0aW9uIDwtIHJiaW5kKFNEMSxTRDIsU0QzLFNENCkKCgojIEdSQUZJQ0EgTUFQQS1NVU5ESSBESUZFUkVOQ0lBRE8gUE9SIFNFUk9USVBPUwoKbWFwLndvcmxkIDwtIG1hcF9kYXRhKG1hcD0id29ybGQiKQoKZ2dwbG90KCkrIAogIGdlb21fbWFwKGRhdGE9bWFwLndvcmxkLCBtYXA9bWFwLndvcmxkLCBhZXMobWFwX2lkPXJlZ2lvbiwgeD1sb25nLCB5PWxhdCksIGZpbGw9IndoaXRlIiwgY29sb3VyPSJibGFjayIsIHNpemU9MC41KSsKICBnZW9tX3BvaW50KGRhdGE9IG11bmRpLmxvY2F0aW9uLCBhZXMoeD1sb24sIHk9bGF0LCBjb2xvcj1TZXJvdHlwZSksc2l6ZT0xLjUsIGFscGhhPTAuNSkrCiAgZ2d0aXRsZSgiTG9jYWxpZGFkZXM6IERpc2ltaWxhcmlkYWQgOTclIikrCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCJ0dXJxdW9pc2UzIiwiZGVlcHBpbmsiLCJtZWRpdW1ibHVlIiwiZ3JlZW4zIikpCgoKYGBgCioqRmlndXJhIDEyLioqIExvY2FsaWRhZGVzIGRlIHNlY3VlbmNpYXMgZGVsIEdlbiBFIDk3JSBkaXNpbWlsYXJlcy4KCgojIyMgTWFwYS1tdW5kaSBsb2NhbGlkYWRlcyA5OCUgRGlzaW1pbGFyaWRhZCAjIyMKCmBgYHtyLCBlY2hvID0gRkFMU0UsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD02LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKbG9jYXRpb24gPC0gd2hpY2goaXMubmEoRGlzXzk4JExvY2F0aW9uKT09RikKCm5hbWVzX2xvY2F0aW9uIDwtIHVuaXF1ZShEaXNfOThbd2hpY2goaXMubmEoRGlzXzk4JExvY2F0aW9uKT09RiksMTBdKQoKbG9jYXRpb25fY291bnRyeV9hbGwgPC0gdmVjdG9yKCkKCmZvcihpIGluIDE6bGVuZ3RoKGxvY2F0aW9uKSl7CiAgbG9jYXRpb25fY291bnRyeV9hbGxbaV0gPC0gIHBhc3RlKERpc185OCRMb2NhdGlvbltsb2NhdGlvbltpXV0sIiwiLERpc185OCRDb3VudHJ5W2xvY2F0aW9uW2ldXSwgc2VwID0gIiIpCn0KCgpsb2NhdGlvbl9jb3VudHJ5IDwtIHVuaXF1ZShsb2NhdGlvbl9jb3VudHJ5X2FsbCkKCiMgU0VST1RJUE8gMQoKU1MxIDwtIGRhdGEuZnJhbWUoKQoKZm9yKGkgaW4gMTpsZW5ndGgobmFtZXNfbG9jYXRpb24pKXsKICBtaW5pLmRhdGEgPC0gRGlzXzk4W3doaWNoKERpc185OCRTZXJvdHlwZT09IkRFTlZfMSIgJiBEaXNfOTgkTG9jYXRpb249PW5hbWVzX2xvY2F0aW9uW2ldKSxdCiAgU1MxW2ksICJTZXJvdHlwZSJdIDwtIG1pbmkuZGF0YSRTZXJvdHlwZVsxXQogIFNTMVtpLCJsb2NhdGlvbl9uYW1lcyJdIDwtIGxvY2F0aW9uX2NvdW50cnlbaV0KICBTUzFbaSwgImxhdCJdIDwtIG1pbmkuZGF0YSRsYXRfbG9jYXRpb25bMV0KICBTUzFbaSwgImxvbiJdIDwtIG1pbmkuZGF0YSRsb25fbG9jYXRpb25bMV0KICBTUzFbaSwgIm51bWJlcl9jYXNlcyJdIDwtIGxlbmd0aChtaW5pLmRhdGEkTG9jYXRpb24pCn0KClNTMSA8LSBuYS5vbWl0KFNTMSkKCiMgU0VST1RJUE8gMgoKU1MyIDwtIGRhdGEuZnJhbWUoKQoKZm9yKGkgaW4gMTpsZW5ndGgobmFtZXNfbG9jYXRpb24pKXsKICBtaW5pLmRhdGEgPC0gRGlzXzk4W3doaWNoKERpc185OCRTZXJvdHlwZT09IkRFTlZfMiIgJiBEaXNfOTgkTG9jYXRpb249PW5hbWVzX2xvY2F0aW9uW2ldKSxdCiAgU1MyW2ksICJTZXJvdHlwZSJdIDwtIG1pbmkuZGF0YSRTZXJvdHlwZVsxXQogIFNTMltpLCJsb2NhdGlvbl9uYW1lcyJdIDwtIGxvY2F0aW9uX2NvdW50cnlbaV0KICBTUzJbaSwgImxhdCJdIDwtIG1pbmkuZGF0YSRsYXRfbG9jYXRpb25bMV0KICBTUzJbaSwgImxvbiJdIDwtIG1pbmkuZGF0YSRsb25fbG9jYXRpb25bMV0KICBTUzJbaSwgIm51bWJlcl9jYXNlcyJdIDwtIGxlbmd0aChtaW5pLmRhdGEkTG9jYXRpb24pCn0KClNTMiA8LSBuYS5vbWl0KFNTMikKCiMgU0VST1RJUEUgMwoKU1MzIDwtIGRhdGEuZnJhbWUoKQoKZm9yKGkgaW4gMTpsZW5ndGgobmFtZXNfbG9jYXRpb24pKXsKICBtaW5pLmRhdGEgPC0gRGlzXzk4W3doaWNoKERpc185OCRTZXJvdHlwZT09IkRFTlZfMyIgJiBEaXNfOTgkTG9jYXRpb249PW5hbWVzX2xvY2F0aW9uW2ldKSxdCiAgU1MzW2ksICJTZXJvdHlwZSJdIDwtIG1pbmkuZGF0YSRTZXJvdHlwZVsxXQogIFNTM1tpLCJsb2NhdGlvbl9uYW1lcyJdIDwtIGxvY2F0aW9uX2NvdW50cnlbaV0KICBTUzNbaSwgImxhdCJdIDwtIG1pbmkuZGF0YSRsYXRfbG9jYXRpb25bMV0KICBTUzNbaSwgImxvbiJdIDwtIG1pbmkuZGF0YSRsb25fbG9jYXRpb25bMV0KICBTUzNbaSwgIm51bWJlcl9jYXNlcyJdIDwtIGxlbmd0aChtaW5pLmRhdGEkTG9jYXRpb24pCn0KClNTMyA8LSBuYS5vbWl0KFNTMykKCiMgU0VST1RJUEUgNAoKU1M0IDwtIGRhdGEuZnJhbWUoKQoKZm9yKGkgaW4gMTpsZW5ndGgobmFtZXNfbG9jYXRpb24pKXsKICBtaW5pLmRhdGEgPC0gRGlzXzk4W3doaWNoKERpc185OCRTZXJvdHlwZT09IkRFTlZfNCIgJiBEaXNfOTgkTG9jYXRpb249PW5hbWVzX2xvY2F0aW9uW2ldKSxdCiAgU1M0W2ksICJTZXJvdHlwZSJdIDwtIG1pbmkuZGF0YSRTZXJvdHlwZVsxXQogIFNTNFtpLCJsb2NhdGlvbl9uYW1lcyJdIDwtIGxvY2F0aW9uX2NvdW50cnlbaV0KICBTUzRbaSwgImxhdCJdIDwtIG1pbmkuZGF0YSRsYXRfbG9jYXRpb25bMV0KICBTUzRbaSwgImxvbiJdIDwtIG1pbmkuZGF0YSRsb25fbG9jYXRpb25bMV0KICBTUzRbaSwgIm51bWJlcl9jYXNlcyJdIDwtIGxlbmd0aChtaW5pLmRhdGEkTG9jYXRpb24pCn0KClNTNCA8LSBuYS5vbWl0KFNTNCkKCm11bmRpLmxvY2F0aW9uIDwtIHJiaW5kKFNTMSxTUzIsU1MzLFNTNCkKCgojIEdSQUZJQ0EgTUFQQS1NVU5ESSBESUZFUkVOQ0lBRE8gUE9SIFNFUk9USVBPUwoKbWFwLndvcmxkIDwtIG1hcF9kYXRhKG1hcD0id29ybGQiKQoKZ2dwbG90KCkrIAogIGdlb21fbWFwKGRhdGE9bWFwLndvcmxkLCBtYXA9bWFwLndvcmxkLCBhZXMobWFwX2lkPXJlZ2lvbiwgeD1sb25nLCB5PWxhdCksIGZpbGw9IndoaXRlIiwgY29sb3VyPSJibGFjayIsIHNpemU9MC41KSsKICBnZW9tX3BvaW50KGRhdGE9IG11bmRpLmxvY2F0aW9uLCBhZXMoeD1sb24sIHk9bGF0LCBjb2xvcj1TZXJvdHlwZSksc2l6ZT0xLjUsIGFscGhhPTAuNSkrCiAgZ2d0aXRsZSgiTG9jYWxpZGFlczogOTglIERpc2ltaWxhcmlkYWQiKSsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoInR1cnF1b2lzZTMiLCJkZWVwcGluayIsIm1lZGl1bWJsdWUiLCJncmVlbjMiKSkKCgoKCmBgYAoqKkZpZ3VyYSAxMy4qKiBMb2NhbGlkYWRlcyBkZSBzZWN1ZW5jaWFzIGRlbCBHZW4gRSA5OCUgZGlzaW1pbGFyZXMuCgojIyMgTWFwYS1tdW5kaSBsb2NhbGlkYWRlcyA5OSUgRGlzaW1pbGFyaWRhZCAjIyMKYGBge3IsIGVjaG8gPSBGQUxTRSwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTYsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9Cgpsb2NhdGlvbiA8LSB3aGljaChpcy5uYShEaXNfOTkkTG9jYXRpb24pPT1GKQoKbmFtZXNfbG9jYXRpb24gPC0gdW5pcXVlKERpc185OVt3aGljaChpcy5uYShEaXNfOTkkTG9jYXRpb24pPT1GKSwxMF0pCgpsb2NhdGlvbl9jb3VudHJ5X2FsbCA8LSB2ZWN0b3IoKQoKZm9yKGkgaW4gMTpsZW5ndGgobG9jYXRpb24pKXsKICBsb2NhdGlvbl9jb3VudHJ5X2FsbFtpXSA8LSAgcGFzdGUoRGlzXzk5JExvY2F0aW9uW2xvY2F0aW9uW2ldXSwiLCIsRGlzXzk5JENvdW50cnlbbG9jYXRpb25baV1dLCBzZXAgPSAiIikKfQoKCmxvY2F0aW9uX2NvdW50cnkgPC0gdW5pcXVlKGxvY2F0aW9uX2NvdW50cnlfYWxsKQoKIyBTRVJPVElQTyAxCgpTRDEgPC0gZGF0YS5mcmFtZSgpCgpmb3IoaSBpbiAxOmxlbmd0aChuYW1lc19sb2NhdGlvbikpewogIG1pbmkuZGF0YSA8LSBEaXNfOTlbd2hpY2goRGlzXzk5JFNlcm90eXBlPT0iREVOVl8xIiAmIERpc185OSRMb2NhdGlvbj09bmFtZXNfbG9jYXRpb25baV0pLF0KICBTRDFbaSwgIlNlcm90eXBlIl0gPC0gbWluaS5kYXRhJFNlcm90eXBlWzFdCiAgU0QxW2ksImxvY2F0aW9uX25hbWVzIl0gPC0gbG9jYXRpb25fY291bnRyeVtpXQogIFNEMVtpLCAibGF0Il0gPC0gbWluaS5kYXRhJGxhdF9sb2NhdGlvblsxXQogIFNEMVtpLCAibG9uIl0gPC0gbWluaS5kYXRhJGxvbl9sb2NhdGlvblsxXQogIFNEMVtpLCAibnVtYmVyX2Nhc2VzIl0gPC0gbGVuZ3RoKG1pbmkuZGF0YSRMb2NhdGlvbikKfQoKU0QxPC0gbmEub21pdChTRDEpCgojIFNFUk9USVBPIDIKClNEMiA8LSBkYXRhLmZyYW1lKCkKCmZvcihpIGluIDE6bGVuZ3RoKG5hbWVzX2xvY2F0aW9uKSl7CiAgbWluaS5kYXRhIDwtIERpc185OVt3aGljaChEaXNfOTkkU2Vyb3R5cGU9PSJERU5WXzIiICYgRGlzXzk5JExvY2F0aW9uPT1uYW1lc19sb2NhdGlvbltpXSksXQogIFNEMltpLCAiU2Vyb3R5cGUiXSA8LSBtaW5pLmRhdGEkU2Vyb3R5cGVbMV0KICBTRDJbaSwibG9jYXRpb25fbmFtZXMiXSA8LSBsb2NhdGlvbl9jb3VudHJ5W2ldCiAgU0QyW2ksICJsYXQiXSA8LSBtaW5pLmRhdGEkbGF0X2xvY2F0aW9uWzFdCiAgU0QyW2ksICJsb24iXSA8LSBtaW5pLmRhdGEkbG9uX2xvY2F0aW9uWzFdCiAgU0QyW2ksICJudW1iZXJfY2FzZXMiXSA8LSBsZW5ndGgobWluaS5kYXRhJExvY2F0aW9uKQp9CgpTRDI8LSBuYS5vbWl0KFNEMikKCiMgU0VST1RJUEUgMwoKU0QzIDwtIGRhdGEuZnJhbWUoKQoKZm9yKGkgaW4gMTpsZW5ndGgobmFtZXNfbG9jYXRpb24pKXsKICBtaW5pLmRhdGEgPC0gRGlzXzk5W3doaWNoKERpc185OSRTZXJvdHlwZT09IkRFTlZfMyIgJiBEaXNfOTkkTG9jYXRpb249PW5hbWVzX2xvY2F0aW9uW2ldKSxdCiAgU0QzW2ksICJTZXJvdHlwZSJdIDwtIG1pbmkuZGF0YSRTZXJvdHlwZVsxXQogIFNEM1tpLCJsb2NhdGlvbl9uYW1lcyJdIDwtIGxvY2F0aW9uX2NvdW50cnlbaV0KICBTRDNbaSwgImxhdCJdIDwtIG1pbmkuZGF0YSRsYXRfbG9jYXRpb25bMV0KICBTRDNbaSwgImxvbiJdIDwtIG1pbmkuZGF0YSRsb25fbG9jYXRpb25bMV0KICBTRDNbaSwgIm51bWJlcl9jYXNlcyJdIDwtIGxlbmd0aChtaW5pLmRhdGEkTG9jYXRpb24pCn0KClNEMzwtIG5hLm9taXQoU0QzKQoKIyBTRVJPVElQRSA0CgpTRDQgPC0gZGF0YS5mcmFtZSgpCgpmb3IoaSBpbiAxOmxlbmd0aChuYW1lc19sb2NhdGlvbikpewogIG1pbmkuZGF0YSA8LSBEaXNfOTlbd2hpY2goRGlzXzk5JFNlcm90eXBlPT0iREVOVl80IiAmIERpc185OSRMb2NhdGlvbj09bmFtZXNfbG9jYXRpb25baV0pLF0KICBTRDRbaSwgIlNlcm90eXBlIl0gPC0gbWluaS5kYXRhJFNlcm90eXBlWzFdCiAgU0Q0W2ksImxvY2F0aW9uX25hbWVzIl0gPC0gbG9jYXRpb25fY291bnRyeVtpXQogIFNENFtpLCAibGF0Il0gPC0gbWluaS5kYXRhJGxhdF9sb2NhdGlvblsxXQogIFNENFtpLCAibG9uIl0gPC0gbWluaS5kYXRhJGxvbl9sb2NhdGlvblsxXQogIFNENFtpLCAibnVtYmVyX2Nhc2VzIl0gPC0gbGVuZ3RoKG1pbmkuZGF0YSRMb2NhdGlvbikKfQoKU0Q0PC0gbmEub21pdChTRDQpCgptdW5kaS5sb2NhdGlvbjEgPC0gcmJpbmQoU0QxLFNEMixTRDMsU0Q0KQoKCiMgR1JBRklDQSBNQVBBLU1VTkRJIERJRkVSRU5DSUFETyBQT1IgU0VST1RJUE9TCgptYXAud29ybGQgPC0gbWFwX2RhdGEobWFwPSJ3b3JsZCIpCgpnZ3Bsb3QoKSsgCiAgZ2VvbV9tYXAoZGF0YT1tYXAud29ybGQsIG1hcD1tYXAud29ybGQsIGFlcyhtYXBfaWQ9cmVnaW9uLCB4PWxvbmcsIHk9bGF0KSwgZmlsbD0id2hpdGUiLCBjb2xvdXI9ImJsYWNrIiwgc2l6ZT0wLjUpKwogIGdlb21fcG9pbnQoZGF0YT0gbXVuZGkubG9jYXRpb24xLCBhZXMoeD1sb24sIHk9bGF0LCBjb2xvcj1TZXJvdHlwZSksc2l6ZT0xLjUsIGFscGhhPTAuNSkrCiAgZ2d0aXRsZSgiTG9jYWxpZGFkZXM6IERpc2ltaWxhcmlkYWQgOTklIikrCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCJ0dXJxdW9pc2UzIiwiZGVlcHBpbmsiLCJtZWRpdW1ibHVlIiwiZ3JlZW4zIikpCgoKYGBgCioqRmlndXJhIDE0LioqIExvY2FsaWRhZGVzIGRlIHNlY3VlbmNpYXMgZGVsIEdlbiBFIDk5JSBkaXNpbWlsYXJlcy4KCgojIyMgQcOxb3M6IERpc2ltaWxhcmlkYWQgOTclICMjIwoKYGBge3IsIGZpZy53aWR0aCA9IDEwLCBmaWcuaGVpZ2h0ID0gNiwgZWNobyA9IEZBTFNFfQoKeWVhcnNEIDwtIHVuaXF1ZShEaXNfOTckWWVhcikKCmNvdW50X3llYXJzRCA8LSBkYXRhLmZyYW1lKCkKCmZvcihpIGluIDE6bGVuZ3RoKHllYXJzRCkpewogIGNvdW50X3llYXJzRFtpLCAiWWVhciJdIDwtIHllYXJzRFtpXQogIGNvdW50X3llYXJzRFtpLCAibnVtYmVyX3llYXIiXSA8LSBsZW5ndGgoRGlzXzk3W3doaWNoKERpc185NyRZZWFyPT15ZWFyc0RbaV0pLDEwXSkKICBjb3VudF95ZWFyc0RbMywgIm51bWJlcl95ZWFyIl0gPC0gbGVuZ3RoKHdoaWNoKGlzLm5hKERpc185NyRZZWFyKT09VCkpCn0KCmNvdW50X3llYXJzRCA8LSB0cmFuc2Zvcm0oY291bnRfeWVhcnNELCBZZWFyPSByZW9yZGVyKFllYXIsIC1udW1iZXJfeWVhcikpCmdncGxvdChkYXRhID0gY291bnRfeWVhcnNELCBhZXMoeCA9IFllYXIsIHkgPSBudW1iZXJfeWVhciwgY29sb3I9WWVhcikpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgZmlsbD0id2hpdGUiKSsKICBsYWJzKHg9ICJZZWFyIiwgeT0gIkRhdGEgTnVtYmVyIikrCiAgc2NhbGVfY29sb3JfZ3JleShzdGFydD0gMC4xLCBlbmQ9MC43KSsKICB0aGVtZV9jbGFzc2ljKCkrCiAgZ2d0aXRsZSgiQcOxb3M6IERpc2ltaWxhcmlkYWQgOTclIikrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikrCiAgY29vcmRfZmxpcCgpCgojIEHDsW9zIHF1ZSBmdWVyb24gZWxpbWluYWRvczoKIyBzZXRkaWZmKGNvdW50X3llYXJzUyRZZWFyLCBjb3VudF95ZWFyc0QkWWVhcikKCiNzb3J0KGNvdW50X3llYXJzRCRZZWFyWzE6MzddKQoKYGBgCioqRmlndXJhIDE1LioqIEHDsW9zIHJlZ2lzdHJhZG9zIHBhcmEgY2Fzb3MgY29uIHNlY3VlbmNpYXMgOTclIGRpc2ltaWxhcmVzLgoKMTk0NSAxOTYwIDE5NjIgMTk2MyAxOTY4IDE5NzAgMTk3MiAxOTczIDE5NzQgMTk3OCAxOTc5IDE5ODAgMTk4MiAxOTgzIDE5ODYgMTk4OCAxOTkxIDE5OTMgMTk5NCAxOTk1IDE5OTYgMjAwMCAyMDAxIDIwMDIgMjAwMyAyMDA0IDIwMDUgMjAwNiAyMDA3IDIwMDggMjAwOSAyMDEwIDIwMTEgMjAwMTIgMjAxMyAyMDE0IAogCgojIyMgQcOxb3M6IERpc2ltaWxhcmlkYWQgOTglICMjIwpgYGB7ciwgZmlnLndpZHRoID0gMTAsIGZpZy5oZWlnaHQgPSA4LCBlY2hvID0gRkFMU0V9Cgp5ZWFyc1MgPC0gdW5pcXVlKERpc185OCRZZWFyKQoKY291bnRfeWVhcnNTIDwtIGRhdGEuZnJhbWUoKQoKZm9yKGkgaW4gMTpsZW5ndGgoeWVhcnNTKSl7CiAgY291bnRfeWVhcnNTW2ksICJZZWFyIl0gPC0geWVhcnNTW2ldCiAgY291bnRfeWVhcnNTW2ksICJudW1iZXJfeWVhciJdIDwtIGxlbmd0aChEaXNfOThbd2hpY2goRGlzXzk4JFllYXI9PXllYXJzU1tpXSksMTBdKQogIGNvdW50X3llYXJzU1szLCAibnVtYmVyX3llYXIiXSA8LSBsZW5ndGgod2hpY2goaXMubmEoRGlzXzk4JFllYXIpPT1UKSkKfQoKY291bnRfeWVhcnNTIDwtIHRyYW5zZm9ybShjb3VudF95ZWFyc1MsIFllYXI9IHJlb3JkZXIoWWVhciwgLW51bWJlcl95ZWFyKSkKZ2dwbG90KGRhdGEgPSBjb3VudF95ZWFyc1MsIGFlcyh4ID0gWWVhciwgeSA9IG51bWJlcl95ZWFyLCBjb2xvcj1ZZWFyKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBmaWxsPSJ3aGl0ZSIpKwogIGxhYnMoeD0gIlllYXIiLCB5PSAiRGF0YSBOdW1iZXIiKSsKICBzY2FsZV9jb2xvcl9ncmV5KHN0YXJ0PSAwLjEsIGVuZD0wLjcpKwogIHRoZW1lX2NsYXNzaWMoKSsKICBnZ3RpdGxlKCJBw7FvczogRGlzaW1pbGFyaWRhZCA5OCUiKSsKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSsKICBjb29yZF9mbGlwKCkKCmBgYAoqKkZpZ3VyYSAxNi4qKiBBw7FvcyByZWdpc3RyYWRvcyBwYXJhIGNhc29zIGNvbiBzZWN1ZW5jaWFzIDk4JSBkaXNpbWlsYXJlcy4KCjE5NDUgMTk2MCAxOTYxIDE5NjIgMTk2MyAxOTY1IDE5NjYgMTk2OCAxOTcwIDE5NzIgMTk3MyAxOTc0IDE5NzcgMTk3OCAxOTc5IDE5ODAgMTk4MSAxOTgyIDE5ODMgMTk4NSAxOTg2IDE5ODcgMTk4OCAxOTg5IDE5OTEgMTk5MyAxOTk0IDE5OTUgMTk5NiAxOTk3IDE5OTggMTk5OSAyMDAwIDIwMDEgMjAwMiAyMDAzIDIwMDQgMjAwNSAyMDA2IDIwMDcgMjAwOCAyMDA5IDIwMTAgMjAxMSAyMDEyIDIwMTMgMjAxNAoKIyMjIEHDsW9zOiBEaXNpbWlsYXJpZGFkIDk5JSAjIyMgCmBgYHtyLCBmaWcud2lkdGggPSAxMCwgZmlnLmhlaWdodCA9IDksIGVjaG8gPSBGQUxTRX0KCnllYXJzRCA8LSB1bmlxdWUoRGlzXzk5JFllYXIpCgpjb3VudF95ZWFyc0QgPC0gZGF0YS5mcmFtZSgpCgpmb3IoaSBpbiAxOmxlbmd0aCh5ZWFyc0QpKXsKICBjb3VudF95ZWFyc0RbaSwgIlllYXIiXSA8LSB5ZWFyc0RbaV0KICBjb3VudF95ZWFyc0RbaSwgIm51bWJlcl95ZWFyIl0gPC0gbGVuZ3RoKERpc185OVt3aGljaChEaXNfOTkkWWVhcj09eWVhcnNEW2ldKSwxMF0pCiAgY291bnRfeWVhcnNEWzMsICJudW1iZXJfeWVhciJdIDwtIGxlbmd0aCh3aGljaChpcy5uYShEaXNfOTkkWWVhcik9PVQpKQp9Cgpjb3VudF95ZWFyc0QgPC0gdHJhbnNmb3JtKGNvdW50X3llYXJzRCwgWWVhcj0gcmVvcmRlcihZZWFyLCAtbnVtYmVyX3llYXIpKQpnZ3Bsb3QoZGF0YSA9IGNvdW50X3llYXJzRCwgYWVzKHggPSBZZWFyLCB5ID0gbnVtYmVyX3llYXIsIGNvbG9yPVllYXIpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIGZpbGw9IndoaXRlIikrCiAgbGFicyh4PSAiWWVhciIsIHk9ICJEYXRhIE51bWJlciIpKwogIHNjYWxlX2NvbG9yX2dyZXkoc3RhcnQ9IDAuMSwgZW5kPTAuNykrCiAgdGhlbWVfY2xhc3NpYygpKwogIGdndGl0bGUoIkHDsW9zOiBEaXNpbWlsYXJpZGFkIDk5JSIpKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpKwogIGNvb3JkX2ZsaXAoKQoKIyBBw7FvcyBxdWUgZnVlcm9uIGVsaW1pbmFkb3M6CiMgc2V0ZGlmZihjb3VudF95ZWFyc1MkWWVhciwgY291bnRfeWVhcnNEJFllYXIpCgpgYGAKKipGaWd1cmEgMTcuKiogQcOxb3MgcmVnaXN0cmFkb3MgcGFyYSBjYXNvcyBjb24gc2VjdWVuY2lhcyA5OSUgZGlzaW1pbGFyZXMuCgojIyMgRnJlY3VlbmNpYSBkZSBsb3MgYcOxb3MgcmVwb3J0YWRvcyBwb3IgY2FkYSBwYWlzOiBEaXNpbWlsYXJpZGFkIDk3JSAjIyMKYGBge3IsIGZpZy53aWR0aCA9IDE4LCBmaWcuaGVpZ2h0ID0gMTAsIGVjaG8gPSBGQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KeWVhcnNEIDwtIG5hLm9taXQodW5pcXVlKERpc185NyRZZWFyKSkKCkNvdW50cnlfbmFtZXNEIDwtIG5hLm9taXQodW5pcXVlKERpc185NyRDb3VudHJ5KSkKCkNvdW50cnlfeWVhciA8LSBkYXRhLmZyYW1lKCkKQ291bnRyeV95ZWFyX21hcyA8LSBkYXRhLmZyYW1lKCkKZm9yKGkgaW4gMTpsZW5ndGgoQ291bnRyeV9uYW1lc0QpKXsKICBmb3IoaiBpbiAxOmxlbmd0aCh5ZWFyc0QpKXsKICAgIGNvLmRhdGEgPC0gRGlzXzk3W3doaWNoKERpc185NyRDb3VudHJ5PT1Db3VudHJ5X25hbWVzRFtpXSAmIERpc185NyRZZWFyPT15ZWFyc0Rbal0pLGMoOSwxMSldCiAgICBDb3VudHJ5IDwtIGFzLmNoYXJhY3Rlcihjby5kYXRhJENvdW50cnlbMV0pCiAgICBZZXJhbm8gPC0gY28uZGF0YSRZZWFyWzFdCiAgICBOdW1iZXJfY2FzZXMgPC0gbGVuZ3RoKGNvLmRhdGEkWWVhcikKICAgIHN1YmRhdGEgPC0gY2JpbmQoQ291bnRyeSwgWWVyYW5vLCBOdW1iZXJfY2FzZXMpCiAgICBDb3VudHJ5X3llYXIgPC0gcmJpbmQoQ291bnRyeV95ZWFyLHN1YmRhdGEpCiAgfQogIENvdW50cnlfeWVhcl9tYXMgPC0gcmJpbmQoQ291bnRyeV95ZWFyKQp9CgpDb3VudHJ5X3llYXJfbWFzIDwtIG5hLm9taXQoQ291bnRyeV95ZWFyX21hcykKCkNvdW50cnlfeWVhcl9tYXMkTnVtYmVyX2Nhc2VzIDwtIGFzLmNoYXJhY3RlcihDb3VudHJ5X3llYXJfbWFzJE51bWJlcl9jYXNlcykKQ291bnRyeV95ZWFyX21hcyROdW1iZXJfY2FzZXMgPC0gYXMubnVtZXJpYyhDb3VudHJ5X3llYXJfbWFzJE51bWJlcl9jYXNlcykKCkNvdW50cnlfeWVhcl9tYXMkWWVyYW5vIDwtIGFzLmNoYXJhY3RlcihDb3VudHJ5X3llYXJfbWFzJFllcmFubykKQ291bnRyeV95ZWFyX21hcyRZZXJhbm8gPC0gYXMubnVtZXJpYyhDb3VudHJ5X3llYXJfbWFzJFllcmFubykKCkNvdW50cnlfeWVhcl9tYXMgPC0gdHJhbnNmb3JtKENvdW50cnlfeWVhcl9tYXMsIFllcmFubz0gcmVvcmRlcihZZXJhbm8sICtZZXJhbm8pKQoKZ2dwbG90KENvdW50cnlfeWVhcl9tYXMsIGFlcyh4PVllcmFubywgeT1Db3VudHJ5KSkgKyAKICBnZW9tX3BvaW50KGFlcyhzaXplPU51bWJlcl9jYXNlcykpKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSkpCmBgYAoqKkZpZ3VyYSAxOC4qKiBGcmVjdWVuY2lhIGRlIGxvcyBhw7FvcyByZXBvcnRhZG9zIHBhcmEgY2FkYSBwYWlzIHBhcmEgc2VjdWVuY2lhcyA5NyUgZGlzaW1pbGFyaWRhZC4KCiMjIyBGcmVjdWVuY2lhIGRlIGxvcyBhw7FvcyByZXBvcnRhZG9zIHBvciBjYWRhIHBhaXM6IERpc2ltaWxhcmlkYWQgOTglICMjIwoKYGBge3IsIGZpZy53aWR0aCA9IDE4LCBmaWcuaGVpZ2h0ID0gMTAsIGVjaG8gPSBGQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KeWVhcnNTIDwtIG5hLm9taXQodW5pcXVlKERpc185OCRZZWFyKSkKCkNvdW50cnlfbmFtZXNTIDwtIG5hLm9taXQodW5pcXVlKERpc185OCRDb3VudHJ5KSkKCkNvdW50cnlfeWVhciA8LSBkYXRhLmZyYW1lKCkKQ291bnRyeV95ZWFyX21hcyA8LSBkYXRhLmZyYW1lKCkKZm9yKGkgaW4gMTpsZW5ndGgoQ291bnRyeV9uYW1lc1MpKXsKICBmb3IoaiBpbiAxOmxlbmd0aCh5ZWFyc1MpKXsKICAgIGNvLmRhdGEgPC0gRGlzXzk4W3doaWNoKERpc185OCRDb3VudHJ5PT1Db3VudHJ5X25hbWVzU1tpXSAmIERpc185OCRZZWFyPT15ZWFyc1Nbal0pLGMoOSwxMSldCiAgICBDb3VudHJ5IDwtIGFzLmNoYXJhY3Rlcihjby5kYXRhJENvdW50cnlbMV0pCiAgICBZZXJhbm8gPC0gY28uZGF0YSRZZWFyWzFdCiAgICBOdW1iZXJfY2FzZXMgPC0gbGVuZ3RoKGNvLmRhdGEkWWVhcikKICAgIHN1YmRhdGEgPC0gY2JpbmQoQ291bnRyeSwgWWVyYW5vLCBOdW1iZXJfY2FzZXMpCiAgICBDb3VudHJ5X3llYXIgPC0gcmJpbmQoQ291bnRyeV95ZWFyLHN1YmRhdGEpCiAgfQogIENvdW50cnlfeWVhcl9tYXMgPC0gcmJpbmQoQ291bnRyeV95ZWFyKQp9CgpDb3VudHJ5X3llYXJfbWFzIDwtIG5hLm9taXQoQ291bnRyeV95ZWFyX21hcykKCkNvdW50cnlfeWVhcl9tYXMkTnVtYmVyX2Nhc2VzIDwtIGFzLmNoYXJhY3RlcihDb3VudHJ5X3llYXJfbWFzJE51bWJlcl9jYXNlcykKQ291bnRyeV95ZWFyX21hcyROdW1iZXJfY2FzZXMgPC0gYXMubnVtZXJpYyhDb3VudHJ5X3llYXJfbWFzJE51bWJlcl9jYXNlcykKCkNvdW50cnlfeWVhcl9tYXMkWWVyYW5vIDwtIGFzLmNoYXJhY3RlcihDb3VudHJ5X3llYXJfbWFzJFllcmFubykKQ291bnRyeV95ZWFyX21hcyRZZXJhbm8gPC0gYXMubnVtZXJpYyhDb3VudHJ5X3llYXJfbWFzJFllcmFubykKCkNvdW50cnlfeWVhcl9tYXMgPC0gdHJhbnNmb3JtKENvdW50cnlfeWVhcl9tYXMsIFllcmFubz0gcmVvcmRlcihZZXJhbm8sICtZZXJhbm8pKQoKZ2dwbG90KENvdW50cnlfeWVhcl9tYXMsIGFlcyh4PVllcmFubywgeT1Db3VudHJ5KSkgKyAKICBnZW9tX3BvaW50KGFlcyhzaXplPU51bWJlcl9jYXNlcykpKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSkpCgoKYGBgCioqRmlndXJhIDE5LioqIEZyZWN1ZW5jaWEgZGUgbG9zIGHDsW9zIHJlcG9ydGFkb3MgcGFyYSBjYWRhIHBhaXMgcGFyYSBzZWN1ZW5jaWFzIDk4JSBkaXNpbWlsYXJpZGFkLgoKIyMjIEZyZWN1ZW5jaWEgZGUgbG9zIGHDsW9zIHJlcG9ydGFkb3MgcG9yIGNhZGEgcGFpczogRGlzaW1pbGFyaWRhZCA5OSUgIyMjCgpgYGB7ciwgZmlnLndpZHRoID0gMTgsIGZpZy5oZWlnaHQgPSAxMCwgZWNobyA9IEZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQp5ZWFyc0QgPC0gbmEub21pdCh1bmlxdWUoRGlzXzk5JFllYXIpKQoKQ291bnRyeV9uYW1lc0QgPC0gbmEub21pdCh1bmlxdWUoRGlzXzk5JENvdW50cnkpKQoKQ291bnRyeV95ZWFyIDwtIGRhdGEuZnJhbWUoKQpDb3VudHJ5X3llYXJfbWFzIDwtIGRhdGEuZnJhbWUoKQpmb3IoaSBpbiAxOmxlbmd0aChDb3VudHJ5X25hbWVzRCkpewogIGZvcihqIGluIDE6bGVuZ3RoKHllYXJzRCkpewogICAgY28uZGF0YSA8LSBEaXNfOTlbd2hpY2goRGlzXzk5JENvdW50cnk9PUNvdW50cnlfbmFtZXNEW2ldICYgRGlzXzk5JFllYXI9PXllYXJzRFtqXSksYyg5LDExKV0KICAgIENvdW50cnkgPC0gYXMuY2hhcmFjdGVyKGNvLmRhdGEkQ291bnRyeVsxXSkKICAgIFllcmFubyA8LSBjby5kYXRhJFllYXJbMV0KICAgIE51bWJlcl9jYXNlcyA8LSBsZW5ndGgoY28uZGF0YSRZZWFyKQogICAgc3ViZGF0YSA8LSBjYmluZChDb3VudHJ5LCBZZXJhbm8sIE51bWJlcl9jYXNlcykKICAgIENvdW50cnlfeWVhciA8LSByYmluZChDb3VudHJ5X3llYXIsc3ViZGF0YSkKICB9CiAgQ291bnRyeV95ZWFyX21hcyA8LSByYmluZChDb3VudHJ5X3llYXIpCn0KCkNvdW50cnlfeWVhcl9tYXMgPC0gbmEub21pdChDb3VudHJ5X3llYXJfbWFzKQoKQ291bnRyeV95ZWFyX21hcyROdW1iZXJfY2FzZXMgPC0gYXMuY2hhcmFjdGVyKENvdW50cnlfeWVhcl9tYXMkTnVtYmVyX2Nhc2VzKQpDb3VudHJ5X3llYXJfbWFzJE51bWJlcl9jYXNlcyA8LSBhcy5udW1lcmljKENvdW50cnlfeWVhcl9tYXMkTnVtYmVyX2Nhc2VzKQoKQ291bnRyeV95ZWFyX21hcyRZZXJhbm8gPC0gYXMuY2hhcmFjdGVyKENvdW50cnlfeWVhcl9tYXMkWWVyYW5vKQpDb3VudHJ5X3llYXJfbWFzJFllcmFubyA8LSBhcy5udW1lcmljKENvdW50cnlfeWVhcl9tYXMkWWVyYW5vKQoKQ291bnRyeV95ZWFyX21hcyA8LSB0cmFuc2Zvcm0oQ291bnRyeV95ZWFyX21hcywgWWVyYW5vPSByZW9yZGVyKFllcmFubywgK1llcmFubykpCgpnZ3Bsb3QoQ291bnRyeV95ZWFyX21hcywgYWVzKHg9WWVyYW5vLCB5PUNvdW50cnkpKSArIAogIGdlb21fcG9pbnQoYWVzKHNpemU9TnVtYmVyX2Nhc2VzKSkrCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxKSkKCmBgYAoqKkZpZ3VyYSAyMC4qKiBGcmVjdWVuY2lhIGRlIGxvcyBhw7FvcyByZXBvcnRhZG9zIHBhcmEgY2FkYSBwYWlzIHBhcmEgc2VjdWVuY2lhcyA5OSUgZGlzaW1pbGFyaWRhZC4KCgojIyMgUGFpcywgbG9jYWxpZGFkIHkgYcOxbyAjIyMKCgpgYGB7ciwgZWNobyA9IEZBTFNFLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9Nn0KCgojIDk3CkRhdGFfTnVtYmVyIDwtIGMobGVuZ3RoKHdoaWNoKGlzLm5hKERpc185NyRDb3VudHJ5KT09RikpLAogICAgICAgICAgICAgICAgIGxlbmd0aCh3aGljaChpcy5uYShEaXNfOTckTG9jYXRpb24pPT1GKSksCiAgICAgICAgICAgICAgICAgbGVuZ3RoKHdoaWNoKGlzLm5hKERpc185NyRDb3VudHJ5KT09RiAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMubmEoRGlzXzk3JFllYXIpPT1GKSksCiAgICAgICAgICAgICAgICAgbGVuZ3RoKHdoaWNoKGlzLm5hKERpc185NyRDb3VudHJ5KT09RiAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMubmEoRGlzXzk3JExvY2F0aW9uKT09RiAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMubmEoRGlzXzk3JFllYXIpPT1GKSkpCgoKRGF0YSA8LSBjKCJDb3VudHJ5IiwgIkNvdW50cnlfTG9jYXRpb24iLCAiQ291bnRyeV95ZWFyIiwgIkNvdW50cnlfbG9jYXRpb25feWVhciIpCgpkdF85NyA8LSBkYXRhLmZyYW1lKERhdGEsIERhdGFfTnVtYmVyKQoKIyA5OApEYXRhX051bWJlciA8LSBjKGxlbmd0aCh3aGljaChpcy5uYShEaXNfOTgkQ291bnRyeSk9PUYpKSwKICAgICAgICAgICAgICAgICBsZW5ndGgod2hpY2goaXMubmEoRGlzXzk4JExvY2F0aW9uKT09RikpLAogICAgICAgICAgICAgICAgIGxlbmd0aCh3aGljaChpcy5uYShEaXNfOTgkQ291bnRyeSk9PUYgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzLm5hKERpc185OCRZZWFyKT09RikpLAogICAgICAgICAgICAgICAgIGxlbmd0aCh3aGljaChpcy5uYShEaXNfOTgkQ291bnRyeSk9PUYgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzLm5hKERpc185OCRMb2NhdGlvbik9PUYgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzLm5hKERpc185OCRZZWFyKT09RikpKQoKRGF0YSA8LSBjKCJDb3VudHJ5IiwgIkNvdW50cnlfTG9jYXRpb24iLCAiQ291bnRyeV95ZWFyIiwgIkNvdW50cnlfbG9jYXRpb25feWVhciIpCgpkdF85OCA8LSBkYXRhLmZyYW1lKERhdGEsIERhdGFfTnVtYmVyKQoKIyA5OQpEYXRhX051bWJlciA8LSBjKGxlbmd0aCh3aGljaChpcy5uYShEaXNfOTkkQ291bnRyeSk9PUYpKSwKICAgICAgICAgICAgICAgICBsZW5ndGgod2hpY2goaXMubmEoRGlzXzk5JExvY2F0aW9uKT09RikpLAogICAgICAgICAgICAgICAgIGxlbmd0aCh3aGljaChpcy5uYShEaXNfOTkkQ291bnRyeSk9PUYgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzLm5hKERpc185OSRZZWFyKT09RikpLAogICAgICAgICAgICAgICAgIGxlbmd0aCh3aGljaChpcy5uYShEaXNfOTkkQ291bnRyeSk9PUYgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzLm5hKERpc185OSRMb2NhdGlvbik9PUYgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzLm5hKERpc185OSRZZWFyKT09RikpKQoKRGF0YSA8LSBjKCJDb3VudHJ5IiwgIkNvdW50cnlfTG9jYXRpb24iLCAiQ291bnRyeV95ZWFyIiwgIkNvdW50cnlfbG9jYXRpb25feWVhciIpCgpkdF85OSA8LSBkYXRhLmZyYW1lKERhdGEsIERhdGFfTnVtYmVyKQoKQ29sb3llIDwtIHJiaW5kKGR0Xzk3LCBkdF85OCwgZHRfOTkpCgp0eXBlIDwtIGMoIjk3ICUgRGlzaW1pbGFyaWRhZCIsICI5NyAlIERpc2ltaWxhcmlkYWQiLCAiOTcgJSBEaXNpbWlsYXJpZGFkIiwgIjk3ICUgRGlzaW1pbGFyaWRhZCIsICI5OCAlIERpc2ltaWxhcmlkYWQiLCAiOTggJSBEaXNpbWlsYXJpZGFkIiwgIjk4ICUgRGlzaW1pbGFyaWRhZCIsICI5OCAlIERpc2ltaWxhcmlkYWQiLCAiOTkgJSBEaXNpbWlsYXJpZGFkIiwgIjk5ICUgRGlzaW1pbGFyaWRhZCIsICI5OSAlIERpc2ltaWxhcmlkYWQiLCAiOTkgJSBEaXNpbWlsYXJpZGFkIikKCkNvbG95ZSA8LSBjYmluZChDb2xveWUsIHR5cGUpCgpsaWJyYXJ5KCJnZ3Bsb3QyIikKCmdncGxvdChkYXRhID0gQ29sb3llLCBhZXMoeD1EYXRhICwgeSA9IERhdGFfTnVtYmVyLCBmaWxsPXR5cGUpKSsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoKSkrCiAgZ2d0aXRsZSgiUGFpcywgTG9jYWxpZGFkIHkgQcOxb3M6IERpc2ltaWxhcmlkYWQgOTcsIDk4LCA5OSUiKSsKICBzY2FsZV9jb2xvdXJfYnJld2VyKCkrCiAgdGhlbWVfbWluaW1hbCgpCgojZ2dwbG90KGRhdGEgPSBzZXJvdHlwZSwgYWVzKHg9TmFtZV9zZXJvdHlwZSAsIHkgPSBkYXRhLCBmaWxsPXR5cGUpKSsKICMgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKCkpKwogICNzY2FsZV9jb2xvdXJfYnJld2VyKCkrCiAgI3RoZW1lX21pbmltYWwoKQoKCmBgYAoqKkZpZ3VyYSAyMS4qKiBGcmVjdWVuY2lhIGRlIGxvcyBkYXRvcyBjb24gZGlzaW1pbGFyaWRhZCBkZWwgOTcsIDk4IHkgOTklIHF1ZSBjb250aWVuZW46IDEuIFBhaXMsIDIuIFBhaXMgeSBMb2NhbGlkYWQsIDMuIFBhaXMsIExvY2FsaWRhZCB5IGHDsW8sIDQuIFBhaXMgeSBhw7FvLg==